我试图从我的数据库中获取相关产品。在下面的示例中,我尝试获取ID为1的产品的相关产品。查询应选择有关产品1的信息(其类型,颜色,大小和样式),然后选择其他产品(不包括其自身)具有相同类型,颜色大小或样式。
SELECT *
FROM prds t1, prds t2
WHERE t1.id = 1
AND t2.id != 1
AND (t1.type_id = t2.type_id
OR t1.colour_id = t2.colour_id
OR t1.size_id = t2.size_id
OR t1.style_id = t2.style_id)
AND t2.published = 1
上述查询只返回产品1次数。我哪里错了?
答案 0 :(得分:1)
我更喜欢将其写为cross join
(因为我在from
子句中憎恶逗号)。但问题是select *
。代替:
SELECT t2.*
FROM prds t1 CROSS JOIN
prds t2
WHERE t1.id = 1 AND t2.id <> 1 AND
(t1.type_id = t2.type_id OR
t1.colour_id = t2.colour_id OR
t1.size_id = t2.size_id OR
t1.style_id = t2.style_id
) AND
t2.published = 1;
真正的区别在于FROM
子句。您的版本正在从两个表中选择所有列。它们不仅具有相同的列名,而且还具有产品1记录中的第一列。