联接在同一张桌子上

时间:2019-03-04 19:53:58

标签: mysql sql join mysql-python

是否有更有效的方法?我一直以为我缺少什么。谢谢

"['<div class=\"content\">rn    gitar calmak icin kullanilan minik plastik garip nesne.rn  </div>']"

我两次击中同一张桌子,我想知道我能否更快地获得相同的结果。

表结构:

SELECT DISTINCT eventId 
FROM event_tags_map 
WHERE tagId in (
    SELECT tagId FROM event_tags_map WHERE eventId=114778
) ORDER BY RAND() LIMIT 5;

索引:

mysql> describe event_tags_map;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| eventId | int(10) unsigned | NO   | PRI | NULL    |       |
| tagId   | int(10) unsigned | NO   | PRI | NULL    |       |
+---------+------------------+------+-----+---------+-------+

1 个答案:

答案 0 :(得分:1)

我看来您将需要两次或多次引用原始表。

我建议您不要使用IN条件,该条件的伸缩性不是很好,并且具有各种反常的行为。

我的第一个选择是使用具有EXISTS条件的相关子查询。这通常是检查是否存在 ...

的最有效方法
SELECT DISTINCT eventId 
FROM event_tags_map m
WHERE EXISTS (
    SELECT 1 FROM event_tags_map m1 WHERE m1.eventId = 114778 AND m1.tagId = m.tagId
)
ORDER BY RAND() LIMIT 5;

另一种选择是使用自我INNER JOIN

SELECT DISTINCT eventId 
FROM event_tags_map m
INNER JOIN event_tags_map m1 ON m1.eventId = 114778 AND m1.tagId = m.tagId
ORDER BY RAND() LIMIT 5;

两个解决方案都应该能够利用event_tags_map(eventId, tagId)上的复合索引。