【问题标题】:How to optimize query with two inner join如何使用两个内连接优化查询
【发布时间】:2016-09-14 12:55:19
【问题描述】:

使用此查询来获取包含满足所有三个必需单词术语(联想、笔记本电脑、计算机)的单词的产品:

SELECT t1.id, t1.name, t1.price FROM
(SELECT p.id AS productid, name, price 
FROM products p JOIN productwords pw ON p.id = pw.productid 
JOIN words w ON pw.wordid = w.id WHERE word.term = 'lenovo') t1
INNER JOIN
(SELECT p.id AS productid, name, price
FROM products p JOIN productwords pw ON p.id = pw.productid 
JOIN words w ON pw.wordid = w.id WHERE word.term = 'laptop') t2
INNER JOIN
(SELECT p.id AS productid, name, price
FROM products p JOIN productwords pw ON p.id = pw.productid 
JOIN words w ON pw.wordid = w.id WHERE word.term = 'computer') t3
ON
t1.productid = t2.productid
AND
t1.productid = t3.productid
ORDER BY t1.name

据我所知,查询考虑了每个词的整个词表(表有索引。数据库是 MySql)。

查询能否以更好的方式重写,从而变得更快? (表格包含数百万行)

例如对于子集,“laptop”搜索只考虑匹配“lenovo”的行 - 而“computer”搜索只考虑首先匹配“lenovo”然后是“laptop”的行。

谢谢!

【问题讨论】:

标签: mysql select inner-join


【解决方案1】:

您可以使用HAVING 子句:

SELECT p.id AS productid, name, price 
FROM products p
JOIN productwords pw ON p.id = pw.productid 
JOIN words w ON pw.wordid = w.id
WHERE word.term in ('lenovo','computer','laptop')
GROUP BY p.id , name, price 
HAVING COUNT(DISTINCT word.term) = 3

也就是说,如果我理解了这个问题,它看起来像 product -> words 是 1:n 关系,如果没有选择 word 表中的列,那应该可以正常工作。

【讨论】:

【解决方案2】:

这可能是一种更快的方法:

SELECT p.id, name, price FROM products p where EXISTS (select null from productwords pw1 JOIN words w1 ON pw1.wordid = w1.id where w1.term = 'lenovo' and p.id = pw1.productid ) and EXISTS (select null productwords pw2 JOIN words w2 ON pw2.wordid = w2.id where w2.term = 'laptop' and and p.id = pw2.productid ) and EXISTS (select null productwords pw3 ON p.id = pw3.productid JOIN words w3 where w3.term = 'computer' and p.id = pw3.productid )
ORDER BY name;

【讨论】:

  • 应该是一样的
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多