繁体   English   中英

PHP MySQL JOIN查询问题

[英]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,我也会得到结果,但这不是预期或需要的结果集。

我写的不正确吗?

任何帮助/指导都将不胜感激!

您的问题是您混淆ANDOR的含义。

您正在寻找的东西,例如

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条件,因此不能有评级均为12

最简单的方法是加入三次:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM