如何添加多个或MySQL查询
实例DB结构(download table)
如何添加多个或MySQL查询
id | pid | title
----------------------------------------------------
1 | 3,4,5 | Download 3, Download 4, Download 5
----------------------------------------------------
2 | 3 | Download 3
----------------------------------------------------
这里是我的代码
<?php
$pid = explode(",", $order['pid']);
for($x = 0; $x < count($pid);){
if(count($pid) == 1) {
$thepid = 'pid="'.$pid[$x].'"';
} else {
$thepid = 'pid="'.$pid[$x].'" OR ';
}
$x++; }
$select = 'SELECT * FROM download WHERE '.$thepid.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {
?>
问题 -
- 如何使
$select
可以阅读pid="3" OR pid="4" OR pid="5"
ifcount($pid)
多个。
我知道表结构不正常。但如何才能实现它的工作。
也许我过于简化这一点,但止跌这容易吗?
<?php
$select = 'SELECT * FROM download WHERE pid IN ('.$order['pid'].')';
$query = $db->rq($select);
while($download = $db->fetch($query)){}
?>
谢谢!在这个时候简单的解决方案来保持当前的结构。 – kampit 2010-06-20 08:00:03
@kampit:这不应该起作用。我看不出''pid ='3,4,5''pid IN('3','4','5')是如何实现的,因为元素3,4,5'是不在集合中。这对你真的有用吗? – 2010-06-20 08:08:24
我的示例返回的SQL查询看起来像 SELECT * FROM download WHERE pid IN(3,4,5); WHERE/IN需要一个数组。构建查询时使用的字符串连接将使其成为可接受的格式,以便mysql将其作为数组读取。 而且它不需要是相同的顺序。 拥有pid =“5,3,4”的问题仍然由非常简单的初等级SQL解决。 SELECT * FROM download WHERE pid IN(5,3,4)ORDER BY pid ASC; 将返回记录3,4和5(按此顺序) – jbudge 2010-06-20 08:11:18
如果你想利用这种结构,坚持(这是不是最佳的,如果你想这样的质疑),你可以使用LIKE:
SELECT * FROM download WHERE pid LIKE '%3%' OR pid LIKE '%4%' OR pid LIKE '%5%'
但你会惹上麻烦,如果你有一个数字> 9
我真的很推荐正常化你的表!
对你的代码的一些评论。
- 您的
for
循环看起来很奇怪。为什么最后要增加$x
而不是在循环的“头部”中定义它? - 您在
for
循环中一次又一次地重新分配$thepid
,因此它将具有最后一次迭代的值。 - 您经常使用
count()
。
这里是一个改进版本,但要注意,这并不只适用,如果你的表是标准化:
<?php
$pids = explode(",", $order['pid']);
$conds = array();
foreach($pids as $pid) {
$conds[] = 'pid="'.$pid.'"';
}
$conds = implode(' OR ', $conds);
$select = 'SELECT * FROM download WHERE '.$cond.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {
感谢兄弟的解释。稍后将对表格进行规范化。 – kampit 2010-06-20 07:58:48
使用REGEXP
SELECT * FROM download WHERE pid REGEXP '\\b(3|4|5|12)\\b'
如果\\b
不支持,你可以尝试:
SELECT * FROM download WHERE pid REGEXP '(^|,)(3|4|5|12)(,|$)'
这不是表示数据的好方法。
我假设你的列代表像
ID - > user_ID的
PID - >用户(以逗号分隔)
标题下载了所有项目的列表 - >列表用户下载的所有项目名称(以逗号分隔)
这种方法的事情是,您会发现像这样的查询比使用常规方法更难以表达。例如:
表用户
USER_ID
表文件
PID
标题
表下载
user_id说明
PID
既作为外键对应的表您的查询就会成为
<?php
$pid = explode(",", $order['pid']);
for($x = 0; $x < count($pid);){
if($x == 0) {
$thepid = 'pid='.mysql_real_escape_string($pid[$x]);
} else {
$thepid = 'OR pid='.mysql_real_escape_string($pid[$x]);
}
$x++; }
$select = 'SELECT user_id FROM download WHERE '.$thepid.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {
?>
感谢您的解释。 – kampit 2010-06-20 07:57:47
我同意,将多个数据存储在单个列中通常不是好事。它迫使你以后(在这里用PHP)处理数据,而不是用SQL查询过滤数据。 – 2011-04-24 02:38:04
相关:http://stackoverflow.com/questions/3030906/multiple-or-clauses-in-mysql – 2010-06-20 21:54:48