1

これは私をかなり混乱させ、多数のフォーラムと「ハウツー」サイトを読んだ後、なぜこれが機能しないのかさらに混乱していると思います.

参加している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

問題は、最後の 3 つの WHERE ステートメントにあるようです。3つのうち2つを削除すると、結果が得られます。しかし、3 つすべてを含めると、適格なレコードがある場合は何も得られません。

最後の 2 つの AND を OR に変更すると、結果も得られますが、期待または必要な結果セットではありません。

私はこれを正しく書いていませんか?

どんな助け/指導も大歓迎です!!

4

3 に答える 3

3

問題は、 と の意味を混同していること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
于 2012-08-26T12:45:01.353 に答える
2

評価に 3 つの異なる行がある場合、そのロジックは使用できません。各行の条件が 1 回チェックされるため、とWHEREの両方の評価を持つ行が存在することはありません。12

最も簡単な方法は、3 回参加することです。

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 ;
于 2012-08-26T12:56:27.357 に答える
1

私はあなたが必要だと思います

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')) 
    )
于 2012-08-26T12:45:29.977 に答える