gpt4 book ai didi

php - MySQL 必须匹配 2 个表中的两列...否则返回空结果?

转载 作者:行者123 更新时间:2023-11-29 12:54:44 24 4
gpt4 key购买 nike

我有一个像这样的 SQL 查询:

SELECT t1.key, t1.value
FROM table1 AS t1, table2 AS t2
WHERE t1.pID IN (45, 67, 88, 32) AND t2.id = t1.id;

这似乎返回 t1.pId IN (45, 67, 88, 32) 的所有行,但它不应该,因为 t2.id 应该进一步减少行结果,但并没有看起来不像是这样做的。

我需要减少通过 t2.id 返回的行,但是如果在对 t1.pId 值数组进行排序后找不到 t2.id,则它应该返回空结果。

已编辑表,尝试选择 t1 列,而不是 t2,抱歉。但前提是满足两个条件,并且仅在第二个条件为真后返回结果行。另外,现在修复了表格,使其正确。

最佳答案

您的查询将返回满足指定条件的每一行。也就是说,它仅检查单个行是否满足谓词,并返回满足谓词的行,而不管不满足谓词的任何行。

如果我明白你在问什么(我不完全确定我明白),你说当某些行满足 t1.id 上的谓词但至少有一行时你想返回一个“空集”在 t1 中,t2 中没有匹配的行。

要检查 t2 中是否有任何行没有“匹配”,我们可以使用反连接模式(还有其他方法......

SELECT SUM(1) AS t1_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL

将其合并到您的查询中,您可以将其用作内联 View ,并包含谓词来检查不匹配的行数,例如:

SELECT d.key
, d.value
FROM ( SELECT SUM(1) AS cnt_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL
) c
CROSS
JOIN table1 d
WHERE d.pID IN (45, 67, 88, 32)
AND c.cnt_rows_not_matched = 0

这可能无法回答您所问的问题,但不清楚您到底在问什么。

<小时/>

每一行都单独检查。如果 a 满足谓词,则将返回它。仅当没有匹配的行时,您发布的查询才会返回空集。

您可能想要检查是否至少有一行与列表中包含的每个 pID 值相匹配。也就是说,例如,如果没有 pID 值为 32 的行,那么您希望查询返回空集,而不是满足条件的行集。

SELECT d.key
, d.value
FROM ( SELECT SUM(1) AS cnt_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL
) c
CROSS
JOIN ( SELECT COUNT(DISTINCT f.pID) AS cnt_pid
FROM table1 f
WHERE f.pID IN (45, 67, 88, 32)
) p
CROSS
JOIN table1 d
WHERE d.pID IN (45, 67, 88, 32)
AND c.cnt_rows_not_matched = 0
AND p.cnt_pid = 4
<小时/>

关于php - MySQL 必须匹配 2 个表中的两列...否则返回空结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24246302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com