繁体   English   中英

在 mySql 中,我怎么问:从表 1 中选择这一行,其中 x = 表 2 中的列或表 2 中没有行

[英]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 byhaving可以做你想做的事:

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.

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