我正在使用MySQL 5.7,并且我有一个复杂的查询,其中包含一些可选的过滤参数。
连接取决于参数是否到来。我认为摘要是:如果有参数,则联接(内部),否则忽略联接。
我已经简化了示例,并获得了以下片段:
SELECT *
FROM commerce cm, commerce_tags cmt
WHERE (? is null or cmt.tag_id = ?) AND
(? is null or cmt.commerce_id = cm.id)
或使用其他语法:
SELECT *
FROM commerce cm
INNER JOIN commerce_tags cmt ON (? is null or cmt.tag_id = ?) AND (? is null or cmt.commerce_id = cm.id)
有没有更清洁(更有效)的方式来做到这一点?也许我让我的生活复杂化了...
最佳答案
切勿在FROM
子句中使用逗号。始终使用正确的,明确的标准JOIN
语法。
我想你要:
SELECT *
FROM commerce cm LEFT JOIN
commerce_tags cmt
ON cmt.commerce_id = cm.id AND ? is not null
WHERE (? is null or cmt.tag_id = ?);
如果第一个参数不为null,则不会运行
join
。关于mysql - 最干净的连接方式取决于参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49173168/