sql查询正在运行但是最后两个并且条件没有给出确切的答案
查询:
SELECT products.*,wishlist.user_id,wishlist.p_id
FROM products
LEFT JOIN wishlist
ON products.pro_id=wishlist.p_id AND products.categ_id=2 AND wishlist.user_id=5
答案 0 :(得分:1)
当您使用left join
时,第一个表中的条件会进入where
子句。第二次的条件是on
:
SELECT p.*, wl.user_id, wl.p_id
FROM products p LEFT JOIN
wishlist wl
ON p.pro_id = wl.p_id AND wl.user_id = 5
WHERE p.categ_id = 2;
这看起来像是一个神秘的功能"的SQL。但它实际上很有意义。 LEFT JOIN
在第一个表中保留所有行,即使ON
子句没有评估为true。这包括第一张桌子上的条件。换句话说,ON
子句忽略第一个表上的条件。
答案 1 :(得分:1)
您的问题没有说明您遇到的问题,因此我将介绍如何解决此问题。
首先,这是一个左连接,所以大概你想要产品表中的所有东西,再加上左连接表中的一些东西。连接条件与where子句的外连接存在巨大差异。
让我们回顾几个排列的意思。通常你想先看看这些。我的建议是你开始,改成内部联接,看看你得到了什么。通过对内部联接进行故障排除并在之后转到外部联接通常更简单。
首先:
SELECT products.*,wishlist.user_id,wishlist.p_id
FROM products
JOIN wishlist
ON products.pro_id=wishlist.p_id AND products.categ_id=2 AND wishlist.user_id=5
确保结果符合您的预期。然后找出你想要的东西。如果您想要所有产品,并将愿望清单数据附加到类别2和用户ID,请返回原始查询。如果您希望category2中的产品具有user_id的愿望清单数据,请执行以下操作:
SELECT products.*,wishlist.user_id,wishlist.p_id
FROM products
LEFT JOIN wishlist
ON products.pro_id=wishlist.p_id AND wishlist.user_id=5
where products.categ_id=2
还有其他一些可能的排列,但除非你清楚从数据库中寻找什么答案,否则这是我能给出的最佳建议。
答案 2 :(得分:0)
您正在加入声明中添加条件;因为它是一个左连接,这意味着您将从您的产品表中获得匹配与否的结果。
如果您只想获得与愿望清单中的产品相匹配的结果,您必须将其更改为where语句或使用内部联接而不是左联接
答案 3 :(得分:-2)
尝试此操作:
SELECT p.*, w.user_id, w.p_id
FROM products p
LEFT JOIN wishlist w
ON p.pro_id = w.p_id
WHERE p.categ_id = 2
AND w.user_id = 5