如何在MySQL查询中添加多个OR

时间:2010-06-20 07:00:00

标签: php mysql

示例数据库结构(download table)

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. 如果$selectpid="3" OR pid="4" OR pid="5",如何count($pid)可以阅读{{1}}。
  2. 我知道表结构不正常。但是如何才能使它发挥作用。

4 个答案:

答案 0 :(得分:2)

这不是表示数据的好方法。

我假设您的列代表

id - &gt; USER_ID

pid - &gt;用户下载的所有项目列表(逗号分隔)

标题 - &gt;用户下载的所有项目名称列表(逗号分隔)

这种方法的一点是你会发现像这样的查询比用普通方法更难表达。例如:

表用户

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)) {
?>

答案 1 :(得分:2)

也许我过度简化了这一点,但这不会更容易吗?

<?php

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

答案 2 :(得分:1)

使用REGEXP

SELECT * FROM download WHERE pid REGEXP '\\b(3|4|5|12)\\b'

如果不支持\\b,您可以尝试:

SELECT * FROM download WHERE pid REGEXP '(^|,)(3|4|5|12)(,|$)'

答案 3 :(得分:0)

如果你想坚持使用这种结构(如果你想进行这样的查询,这不是最佳的),你可以使用LIKE

SELECT * FROM download WHERE pid LIKE '%3%' OR pid LIKE '%4%' OR pid LIKE '%5%'

但如果你有数字&gt;你会遇到麻烦9。

我真的建议规范你的桌子!


对您的代码提出一些意见。

  1. 您的for循环看起来很奇怪。为什么在最后增加$x而不是在循环的“头部”中定义它?
  2. 您在$thepid循环中一次又一次地重新分配for,因此它将具有上次迭代的值。
  3. 您经常使用count()
  4. 这是一个改进版本,但请注意,只有在您的表格规范化后才能生效

    <?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)) {