如何添加多个或MySQL查询

如何添加多个或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)) { 
?> 

问题 -

  1. 如何使$select可以阅读pid="3" OR pid="4" OR pid="5" if count($pid)多个。

我知道表结构不正常。但如何才能实现它的工作。

+1

相关:http://stackoverflow.com/questions/3030906/multiple-or-clauses-in-mysql – 2010-06-20 21:54:48

也许我过于简化这一点,但止跌这容易吗?

<?php 

$select = 'SELECT * FROM download WHERE pid IN ('.$order['pid'].')'; 
$query = $db->rq($select); 
while($download = $db->fetch($query)){} 
?> 
+0

谢谢!在这个时候简单的解决方案来保持当前的结构。 – kampit 2010-06-20 08:00:03

+0

@kampit:这不应该起作用。我看不出''pid ='3,4,5''pid IN('3','4','5')是如何实现的,因为元素3,4,5'是不在集合中。这对你真的有用吗? – 2010-06-20 08:08:24

+1

我的示例返回的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

我真的很推荐正常化你的表!


对你的代码的一些评论。

  1. 您的for循环看起来很奇怪。为什么最后要增加$x而不是在循环的“头部”中定义它?
  2. 您在for循环中一次又一次地重新分配$thepid,因此它将具有最后一次迭代的值。
  3. 您经常使用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)) { 
+0

感谢兄弟的解释。稍后将对表格进行规范化。 – 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)) { 
?> 
+0

感谢您的解释。 – kampit 2010-06-20 07:57:47

+0

我同意,将多个数据存储在单个列中通常不是好事。它迫使你以后(在这里用PHP)处理数据,而不是用SQL查询过滤数据。 – 2011-04-24 02:38:04