【问题标题】:PHP MySQL JOIN Query IssuesPHP MySQL JOIN 查询问题
【发布时间】:2012-08-26 12:40:21
【问题描述】:

这让我很困惑,在阅读了许多论坛和“如何”网站之后,我想我更困惑为什么这不起作用。

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

我是不是写错了?

非常感谢任何帮助/指导!

【问题讨论】:

  • 如果您将评级源 1 2 和 3 的“AND”切换为“OR”会发生什么
  • @Rmilligan:您拥有的记录(评分为 1、2 和 3)是否位于表的 3不同行中?

标签: php mysql join


【解决方案1】:

你的问题是你混淆了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

【讨论】:

  • 我在关注你,但是将最后两个 AND 更改为 OR 会给我一个不准确的结果集,并且超出了应该返回的范围。我正在寻找的是 ratingSource=1 和 1-4 AND ratingSource=2 以及 0-100 AND ratingSource=3 和 0-100 之间。我有符合条件的记录。所以,你的回答是基本逻辑 - 是的 - 但它不能帮助我解决我的问题。
  • 您应该做的是检查什么对您的逻辑有效。您现在给出的示例是您没有添加任何括号,因此“OR”适用于所有内容。如果您不只是在修复了第一步后停下来,它应该可以帮助您解决问题,而且还要考虑为什么第二步可能会出错。我将添加我认为您的意思作为查询,但是如果您了解正在发生的事情确实会更好。这将帮助您解决问题..
  • 一行怎么会有ratingScore=2ratingScore=3?这是不可能的。
  • 评分表中每个产品有 3 行。每行代表每个单独的评级实体。
  • @Rmilligan2372:WHERE 子句过滤每行。所以每一行都必须匹配WHERE 中定义的所有条件。我认为您应该更改数据库架构。
【解决方案2】:

如果您有 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 ;

【讨论】:

  • 感谢 ypercube - 您完全了解我的需求,并且在实施您的建议后,它运行良好!非常感谢!
【解决方案3】:

我认为你需要

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')) 
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多