如何创建一个where子句,其值是前一个sql查询中的数组

时间:2014-03-21 20:38:22

标签: php mysql

我有一个来自SQL数据库的小数据列表,并使用mysql_fetch_array($query_run)来获取它。这一切都很好,我可以echo出这些数据来仔细检查它。

但是我想要使用它的是另一个SQL查询,但它不等于它。我的代码目前只包含其中一个数据项。所以,我猜你必须做点什么才能让它知道它不仅仅是一个数据?

这是我的代码:

$query = "SELECT * FROM myFriends WHERE idPerson = '$loggedInUserId'";
$query_run = mysql_query($query); 
while($row = mysql_fetch_array($query_run)) {
$idfriend = $row['idFriend'];       
$queryFrirend = "SELECT * FROM perosn WHERE idPerson != '$idfriend'

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

就个人而言,如果从MySQL查询返回该集合,我不会费心将数组转换为WHERE子句。关系数据库是为这种事情而构建的。

使用熟悉的反连接模式的查询将返回指定的结果:

SELECT p.*
  FROM person p
  LEFT
  JOIN myFriends f
    ON f.idFriend = p.idPerson
   AND f.idPerson = '$loggedInUserId'
 WHERE f.idFriend IS NULL

这表示从person表获取所有行,并匹配myFriends表中的行。 WHERE子句表示要排除找到匹配行的行,只留下从myFriends返回的没有匹配行的人的行。有了适当的索引,MySQL就可以开始使用它,而不需要在WHERE子句中发送id值列表的开销。

但是,这并没有真正回答你提出的问题。

您指定的SQL,包括要排除的idPerson值列表,可以有多种形式:

SELECT p.*
  FROM person p
 WHERE p.idPerson NOT IN (2,3,5,7,11,13,15,17,19)

SELECT p.*
  FROM person p
 WHERE p.idPerson <> 2 
   AND p.idPerson <> 3
   AND p.idPerson <> 5
   AND p.idPerson <> 7
   AND p.idPerson <> 11 
   AND p.idPerson <> 13
   AND p.idPerson <> 15
   AND p.idPerson <> 17 

SELECT p.*
  FROM person p
 WHERE NOT EXISTS
       ( SELECT 1
           FROM ( SELECT 2 AS idPerson
                  UNION ALL SELECT 3
                  UNION ALL SELECT 5
                  UNION ALL SELECT 7
                  UNION ALL SELECT 9
                  UNION ALL SELECT 11
                  UNION ALL SELECT 13
                  UNION ALL SELECT 15
                  UNION ALL SELECT 17
                  UNION ALL SELECT 19
                ) f
          WHERE f.idPerson = p.idPerson
       )

SELECT p.*
  FROM person p
  LEFT
  JOIN ( SELECT 2 AS idPerson
         UNION ALL SELECT 3
         UNION ALL SELECT 5
         UNION ALL SELECT 7
         UNION ALL SELECT 9
         UNION ALL SELECT 11
         UNION ALL SELECT 13
         UNION ALL SELECT 15
         UNION ALL SELECT 17
         UNION ALL SELECT 19
       ) f
    ON f.idPerson = p.idPerson
 WHERE f.idPerson IS NULL

只需循环遍历结果集中的行,并使用该值来格式化适当的SQL语句。最简单的方法(除了上述避免必须运行两个单独的查询以获得所需的结果集),将构建friendId列值的数组。然后将该数组转换为逗号分隔的文字2,3,5,7,9,11,13,17,19字符串。当然,您需要处理没有返回行的边缘情况,因为foo NOT IN ()不是有效的SQL语法。

如果你想动态构建语句,当你循环遍历行时,你可以这样做:

  $queryFrirend = "SELECT * FROM person WHERE 1=1";
  while($row = mysql_fetch_array($query_run)) {
    $queryFrirend .= " AND idPerson <> " . (int) $row['idFriend'];
  }
  $queryFrirend .= " ORDER BY idPerson";
  echo "SQL=", $queryFrirend;

虽然那会是一些丑陋的SQL。 (当DBA来找你时,我不想在附近。)

答案 1 :(得分:-2)

您无法在SQL查询中使用数组。您需要将数组转换为由逗号分隔的值字符串,并使用IN()。

SELECT * FROM perosn WHERE idPerson Not IN ('person1', 'person2')