我有一个来自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'
任何帮助都会很棒!
答案 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')