我想查询一个表然后加入第二个表但是如果第二个表中没有数据只显示第一个表中的内容。
因此,我正在尝试的表格orders
和表格payments
SELECT orders. * , payments. *
FROM orders
INNER JOIN payments ON orders.user_id = payments.userID
WHERE orders.user_id =3
AND payments.processed = ''
OR payments.processed >= '0'
此查询会返回一些奇怪的结果。目前,表orders
中有3条记录,payments
表中有{2}条记录。它应该返回3条记录,因为它们在user_id = 3
中是3。但它会从orders
两次返回我的每条记录,即6个结果。
我在这里失踪了什么?
答案 0 :(得分:0)
这是因为AND
和OR
上缺少括号,AND
优先于OR
:
SELECT orders. * , payments. *
FROM orders
INNER JOIN payments ON orders.user_id = payments.userID
WHERE orders.user_id =3
AND (payments.processed = ''
OR payments.processed >= '0')
您的查询正如此评估:
WHERE (orders.user_id =3 AND payments.processed = '')
OR(payments.processed >= '0')
另一个可以使结果倍增的事情是每个订单都有多个付款。
答案 1 :(得分:0)
根据您的查询,搜索引擎必须看起来有点像:
Orders:
ID | user_ID | ...
---+---------+----
01 | 3 | ...
02 | 3 | ...
03 | 3 | ...
Payments:
ID | userID | processed | ...
---+---------+-----------+----
01 | 3 | | ...
02 | 3 | 1 | ...
现在我的问题是你为什么要加入用户ID? 您可以使用数据库为每个订单运行联接,并查看使用相同的用户ID找到多少付款。这意味着对于user_id = 3的每三个订单,它会找到两个PayID,userID = 3。那就是2 * 3 = 6,所以就像你说的那样选择了六行。
如果您要选择所有具有相关付款的订单,则付款和订单之间必须存在关联。在你的情况下,它与一个订单的关系可以有0-1支付,这意味着你的数据表应该看起来像这样:
Orders:
ID | user_ID | ...
---+---------+----
01 | 3 | ...
02 | 3 | ...
03 | 3 | ...
Payments:
ID | userID | OrderID | processed | ...
---+---------+---------+-----------+----
01 | 3 | 01 | | ...
02 | 3 | 02 | 1 | ...
FOREIGN KEY Payments.OrderID -> Orders.ID
在这种情况下,cou可以在Orders.ID上将Payments.OrderID作为外键加入。
<强> IMPORTENT:强> 如果你想获得所有订单行,你必须使用LEFT JOIN而不是INNER JOIN!
SELECT orders. * , payments. *
FROM orders
LEFT JOIN payments ON payments.OrderID = orders.ID
WHERE orders.user_id = 3
...
Maby你应该告诉我们你的数据库结构,这样我们就可以看看你们之间的实际参考。