SQL查询没有给出确切的答案

时间:2017-08-20 14:33:28

标签: php sql

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

4 个答案:

答案 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