[英]PHP MySQL JOIN Query Issues
这个让我非常困惑,在阅读了许多论坛和“操作方法”网站之后,我认为我什至更加困惑为什么它不起作用。
我要加入2张桌子。
表1(产品)包含我所有的产品详细信息。
表2(等级)包含每种产品的所有等级,每种产品具有3个不同等级实体的3个等级。
我正在处理一组AJAX搜索过滤器,需要以合并所有过滤器的方式编写查询。
过滤器包括价格,评论数量,平均评论星级,等级1,等级2,等级3。
价格,数量评论和平均星数来自表1(产品)。
等级1、2和3来自表2(等级)。
我的查询需要这样的东西,但是当我知道(已在数据库中验证)我的记录符合我要查询的条件时,这将返回零结果。
SELECT p.id, p.name
FROM products p
JOIN ratings r ON p.id = r.id
WHERE p.num_reviews BETWEEN '0' AND '1000'
AND p.price BETWEEN '0' AND '500'
AND p.avg_rvw_stars BETWEEN '0' AND '5'
AND (r.ratingSource='1' AND (r.rating BETWEEN '1' AND '4'))
AND (r.ratingSource='2' AND (r.rating BETWEEN '0' AND '100'))
AND (r.ratingSource='3' AND (r.rating BETWEEN '0' AND '100'))
ORDER BY p.name ASC
问题似乎出在最后三个WHERE语句中。 如果我删除3中的任何2个,就会得到结果。 但是,当我将所有3个都包括在内时,如果有符合条件的记录,我将一无所获。
如果将最后两个AND更改为OR,我也会得到结果,但这不是预期或需要的结果集。
我写的不正确吗?
任何帮助/指导都将不胜感激!
您的问题是您混淆AND
和OR
的含义。
您正在寻找的东西,例如
r.ratingSource='1'
一会儿他们也应该有
r.ratingSource='2'
没有什么是对这有效的,因为这是一件事情,不能兼而有之。 因此,您需要考虑AND
作用。
如果您有每个结果都必须具备的内容,则应使用AND。 如果您有一组他们可能拥有的东西,则可以执行(thing AND otherthing) OR (thing2 and otherthing2)
这实际上是所有基本逻辑:)
我想你可能是这个意思:
SELECT p.id, p.name
FROM products p
JOIN ratings r ON p.id = r.id
WHERE p.num_reviews BETWEEN '0' AND '1000'
AND p.price BETWEEN '0' AND '500'
AND p.avg_rvw_stars BETWEEN '0' AND '5'
AND (
(r.ratingSource='1' AND (r.rating BETWEEN '1' AND '4'))
OR (r.ratingSource='2' AND (r.rating BETWEEN '0' AND '100'))
OR (r.ratingSource='3' AND (r.rating BETWEEN '0' AND '100'))
)
ORDER BY p.name ASC
如果您的评分有3个不同的行,则不能使用该逻辑。 每行都要检查一次WHERE
条件,因此不能有评级均为1
和2
。
最简单的方法是加入三次:
SELECT p.id, p.name
FROM products p
JOIN ratings r1 ON p.id = r1.id
AND r1.ratingSource = 1
AND r1.rating BETWEEN 1 AND 4
JOIN ratings r2 ON p.id = r2.id
AND r2.ratingSource = 2
AND r2.rating BETWEEN 0 AND 100
JOIN ratings r3 ON p.id = r3.id
AND r3.ratingSource = 3
AND r3.rating BETWEEN 0 AND 100
WHERE p.num_reviews BETWEEN 0 AND 1000
AND p.price BETWEEN 0 AND 500
AND p.avg_rvw_stars BETWEEN 0 AND 5
ORDER BY p.name ASC ;
我觉得你需要
AND
(
(r.ratingSource='1' AND (r.rating BETWEEN '1' AND '4'))
OR (r.ratingSource='2' AND (r.rating BETWEEN '0' AND '100'))
OR (r.ratingSource='3' AND (r.rating BETWEEN '0' AND '100'))
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.