我正在使用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/

10-15 13:46