我正在使用MySQL 5.7,我有一个复杂的查询,其中包含一些可选的过滤参数。 并且连接取决于参数是否来。我认为摘要是:如果有参数,则join(inner)else忽略join。
我已经简化了这个例子,我得到了以下片段:
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)
有更清洁和(更有效)的方法吗?也许我让生活变得复杂......
答案 0 :(得分:0)
从不在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
。