我需要使用多个 JOINS 和多个 WHERE 子句根据外键 id 从各个表中提取数据。
目前我有这个(当然不起作用):
SELECT table_1.*
FROM table_1
JOIN table_2
ON table_1.from = table_2.id
WHERE table_2.name = 'from-city'
JOIN table_2
ON table_1.to = table_2.id
WHERE table_2.name = 'to-city'
ORDER BY table_1.id;
我需要以一种将来可以添加大量其他 WHERE 子句的方式实现这一点(考虑基于 queryStrings [URLSearchParams] 的动态查询)。
从长远来看,我该如何“思考”这个问题才不会搬起石头砸自己的脚?
我发现要使用多个连接,你必须执行以下操作:
SELECT table_1.*
FROM table_1
JOIN table_2
ON table_1.from = table_2.id AND table_1.to = table_2.id
-- But this screws up my where clause 'logic' …
WHERE table_2.name = 'from-city' ?
WHERE table_2.name = 'to-city' ?
ORDER BY table.id;
但我想这就是你们谈论不同价值观的地方,对吧?
我更愿意写一些类似的东西:
SELECT table_1.*
FROM table_1
JOIN table_2
ON table_1.from = table_2.id
WHERE table_2.name = 'from-city'
AND table_1.to = table_2.id
WHERE table_2.name = 'to-city'
ORDER BY table_1.id;
为了让我以这种更易于管理、动态和可读的方式编写查询,正确的“思维模式”是什么?
我尝试了什么? 我只是在谷歌上搜索了一些废话,观看了有关复杂 SQL 查询的视频,并进行了疯狂的猜测——在这方面并没有真正帮助自己。
连接同一个表两次的正确语法是为其指定不同的别名,从而能够将这两行视为来自不同的表:
SELECT *
FROM table_1 t1
JOIN table_2 t2a ON t2a.id = t1.from and t2a.name = 'from-city'
JOIN table_2 t2b ON t2b.id = t1.to and t2b.name = 'to-city'
ORDER BY t1.id;
我希望这能回答您的问题。
但是,如果你只想从第一个表中选择数据,那么你只需要第二个表作为过滤条件,我根本不会加入,而是将条件放在它所属的where子句中:
SELECT *
FROM table_1 t1
WHERE t1.from = (SELECT id FROM table_2 WHERE name = 'from-city')
AND t1.to = (SELECT id FROM table_2 WHERE name = 'to-city')
ORDER BY t1.id;