繁体   English   中英

如何使where子句的值是来自先前sql查询的数组

[英]How to make a where clause where the value is an array from a previous sql query

我有一小列来自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'

任何帮助将是巨大的!

就个人而言,如果该集合是从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来找你时待在身边。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM