我有events、events_styles、events_formats 表(一个事件可以有多种样式和格式) 我正在尝试过滤具有 events_styles 连接和 events_formats 连接的事件。所以查询应该选择所有具有特定样式和特定格式的事件 - 我到目前为止的尝试:
SELECT * FROM events
JOIN events_styles ON events.id = events_styles.event_id
JOIN events_formats ON events.id = events_formats.format_id
WHERE events_styles.style_id = 3 AND events_formats.format_id = 1;
Empty set (0.00 sec)
SELECT * FROM events_styles
WHERE events_styles.style_id = 3
+----------+----------+
| event_id | style_id |
+----------+----------+
| 3 | 3 |
| 2 | 3 |
| 4 | 3 |
+----------+----------+
3 rows in set (0.00 sec)
SELECT * FROM events_formats
WHERE events_formats.format_id = 1
+----------+-----------+
| event_id | format_id |
+----------+-----------+
| 1 | 1 |
| 3 | 1 |
| 4 | 1 |
+----------+-----------+
3 rows in set (0.00 sec)
所以第一个查询应该返回 id 为 4 的事件? 我确定我需要将第二个和第三个查询合并到一个子查询中,但我不确定语法 - 谢谢
最佳答案
你非常接近!
您的查询应该是:
SELECT * FROM events
JOIN events_styles ON events.id = events_styles.event_id
JOIN events_formats ON events.id = events_formats.event_id
WHERE events_styles.style_id = 3
AND events_formats.format_id = 1;
通过加入 format_id 而不是 event_id,您只会得到 event_id = 1,它没有对应的样式 ID 3。这就是您出错的地方:-)
关于mysql 多个多对多连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8803881/