2
table products
--------------
id | title
1  | Product 1
2  | Product 2
3  | Product 3

table categories
----------------
id | title
1  | Cat 1
2  | Cat 2
3  | Cat 3

table products_categories_mm
----------------
id_local | id_foriegn
1        | 2
1        | 3
2        | 3
3        | 2

 

SELECT * 
FROM products 
    JOIN products_categories_mm ON products.uid=products_categories_mm.uid_local 
    JOIN categories ON products_categories_mm.uid_foreign = categories.uid 
WHERE products.lang_uid IN (0) 
    AND products.page >= 1 
    AND products.page IN (8,9,10,11) 
    AND categories.uid IN (2,3) 
ORDER BY products.datetime DESC

上記は、カテゴリ 2 および 3 に関連するすべての製品を検索します。製品レコード 1、2、および 3 を返します。これは問題なく、希望どおりに機能します。しかし、今度はクエリを調整して、カテゴリ 2 とカテゴリ 3 の両方に関連する製品が返されるようにする必要があります。

この場合、クエリは製品 1 を返す必要があります (両方のカテゴリに関連する唯一の製品であるため)。

SQL を次のように変更しようとしました。

SELECT * 
FROM products 
    JOIN products_categories_mm ON products.uid=products_categories_mm.uid_local 
    JOIN categories ON products_categories_mm.uid_foreign = categories.uid 
WHERE products.lang_uid IN (0) 
    AND products.page >= 1 
    AND products.page IN (8,9,10,11) 
    AND (categories.uid = 2 AND categories.uid = 3)
ORDER BY products.datetime DESC

しかし、これは何も返しません。EXPLAIN不可能な where 句があると言います。

必要なレコードを取得するために SQL を変更するにはどうすればよいですか?

4

3 に答える 3

1

次の行に単純な論理障害があるため、不平を言っています。

AND (categories.uid = 2 AND categories.uid = 3)

両方の値になることはありません。どちらか一方のみです。次のことを意味していたに違いありません。

AND (categories.uid = 2 OR categories.uid = 3)

次のように書き換えることもできます。

AND (categories.uid IN (2,3))

余談ですが、ポイントは次のとおりです。

AND products.page >= 1

さらに下にフィルタリングしている場合:

AND products.page IN (8,9,10,11)

これの最初のビットは必要ありません。

于 2012-06-15T11:23:52.550 に答える
1
SELECT
    a.*
FROM
    products a
INNER JOIN
    products_categories_mm b ON a.uid = b.uid_local
WHERE
    a.lang_uid = 0
    AND a.page IN (8,9,10,11)
    AND b.uid_foreign IN (2,3)
GROUP BY
    a.uid
HAVING
    COUNT(*) = 2
ORDER BY
    a.datetime DESC

2inCOUNT(*) = 2は、チェックしたいカテゴリの数を表します。3 つまたは 4 つのカテゴリを満たしている場合にのみ商品を表示する場合は、それに応じてその数を変更します。

于 2012-06-14T21:33:29.830 に答える
1

SQL の説明は、2 と 3 の UID が異なる行に表示されるため、UID が 2 と 3 の両方である単一の行を持つことは不可能であるためです。別のアプローチを行うのがおそらく最善でしょう...たとえば、サブクエリ。

于 2012-06-14T21:30:30.397 に答える