[英]In mySql, how can I ask: select this row from table 1 where x = column in table 2 or no rows in table 2
在这里找不到答案,只有碎片......具体来说:
Table 1
id, product
Table 2
id, keyword, value
给定一个关键字和值列表(数组、json、任何东西),例如:
year=1920
model=R45-2
color=green
对于表 1 中与 id 匹配的给定行,表 2 中可能没有行,也可能没有行。 每个都有不同的关键字和值。
我需要返回表 1 中的行,其中表 2 中没有匹配对,或者列表中的每个关键字都与表 2 中的相应值匹配。
我知道我可以使用 IN、JOINS 和子查询,但是我想到的每个解决方案看起来都很糟糕(并且可能是一个速度猪)。 什么是快速,高效,清晰的阅读方式来做到这一点? 请记住,提供的“列表”可能没有、一个或 n 个条目; 表 2 也是如此。 对于表 2 中的给定关键字根本没有匹配应允许表 1 行通过,或全部在列表中匹配; 任何关键字/值不匹配都应使表 1 中的该行无效。
祝你好运。
我认为group by
和having
可以做你想做的事:
select t1.id, t1.product
from table1 t1
left join table2 t2 using (id)
group by t1.id, t1.product
having not max(
(t2.keyword = 'year' and t2.value <> '1920')
+ (t2.keyword = 'model' and t2.value <> 'R45-2')
+ (t2.keyword = 'color' and t2.value <> 'green')
) <=> 1
这是最终奏效的方法; 看起来最简单:(仅相关部分)
用户想要颜色=绿色,尺寸=小。 所以,术语的数量是两个。
SELECT ... LEFT JOIN (SELECT itemID, COUNT(itemID) AS filterCount FROM auctionExtras E WHERE (E.key = 'color' AND E.value = 'green') OR (E.key = 'size' AND E.value = 'small') [OR term clause n] GROUP BY itemID) as F on (...) WHERE (filterCount = [number of terms])
我认为子查询相当快,因为 ON 限制为来自主查询的 ID,并且除非您将它们添加到 WHERE 中,否则根本不会评估连接文件中的“键”。 一切都被索引了,我怀疑有人会使用超过五个键/值对。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.