Check this fiddle for DB and tables
SELECT p.*
FROM Products p
LEFT JOIN offertran ot
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id = (SELECT id FROM Offers
Where dF<=3 AND dt>=3)
ORDER BY o.id DESC,
p.prod_id ASC
LIMIT 20
输出是:
| PROD_ID | CATEGORY_ID | PROD_NAME | BRAND | PRICE | STATUS |
---------------------------------------------------------------
| p3 | c1 | prod3 | brand3 | 3000 | active |
| p3 | c1 | prod3 | brand3 | 3000 | active |
| p1 | c1 | prod1 | brand1 | 1000 | active |
| p2 | c2 | prod2 | brand2 | 2000 | active |
| p4 | c2 | prod4 | brand1 | 4000 | active |
| p5 | c1 | prod5 | brand2 | 5000 | active |
| p6 | c2 | prod6 | brand3 | 6000 | active |
但是,在这里您可以看到p3
两次显示。我不知道为什么..
我已经尝试了所有可能的方法,但我找不到任何补救措施.. :(
答案 0 :(得分:4)
中的问题
LEFT JOIN Offers o
ON ot.offer_id = (SELECT id FROM Offers
Where dF<=3 AND dt>=3)
您使用常量值加入ot.offer_id(没有任何意义可以从商品表中选择它们。)
正确的方法:
SELECT p.*
FROM Products p
LEFT JOIN offertran ot
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id = o.id AND o.dF<=3 AND o.dt>=3
ORDER BY o.id DESC,
p.prod_id ASC
LIMIT 20
答案 1 :(得分:1)
可能缺少'o'和'ot'之间的连接条件:
SELECT p.*
FROM Products p
LEFT JOIN offertran ot
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id IN(SELECT id FROM Offers
Where dF<=3 AND dt>=3)
**AND ot.offer_id = o.id***
ORDER BY o.id DESC,
p.prod_id ASC
LIMIT 20
或者我可能错过了一些内容,并没有根据您的查询提出您希望从数据库获得的内容。
答案 2 :(得分:1)
可能你正在寻找这个。这将仅返回p3一次。 你在第二次左连接条件下错过了o.id.
SELECT p.*
FROM Products p
LEFT JOIN offertran ot
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON o.id = (SELECT id FROM Offers
Where dF<=3 AND dt>=3)
ORDER BY o.id DESC,
p.prod_id ASC
LIMIT 20
答案 3 :(得分:0)
您可能在offertran
或Products
中有两条记录,PROD_ID为p3。您可以将其更改为SELECT DISTINCT p.* FROM ...
,这样就会忽略任何重复的行。
要查看offertran
返回的内容,请将select p.*
更改为select *