1

私はこのクエリを実行しようとしています:

SELECT
    gc_category_products.product_id, 
    LEAST(IFNULL(NULLIF(saleprice, 0), price),price) AS sort_price,
    GROUP_CONCAT(CONVERT(category_id, CHAR(8))) AS cats
FROM
    (`gc_category_products`)
JOIN `gc_products` ON `gc_category_products`.`product_id` = `gc_products`.`id`
WHERE
        `category_id` = '31'
    OR `category_id` = '35'
    OR `category_id` = '30'
    OR `category_id` = '36'
    OR `category_id` = '37'
    OR `category_id` = '34'
AND 
    `enabled` = 1
GROUP BY
    `product_id`
LIMIT 10

また、catsフィールドでは1つの数値のみが返され、WHERE句をすべて削除すると、コンマ区切りのリストが返されますが、データをフィルタリングするには、これらのWHEREが必要です。

何か案は?

サンプルデータ

gc_category_products
--------------------------
product_id | category_id |
--------------------------
3          | 31          |
3          | 18          |
4          | 35          |
4          | 21          |


gc_products
-----------------------------------
| id | price | saleprice | enabled|
-----------------------------------
| 3  | 23.00 | 0.00      | 1      |
| 4  | 50.00 | 0.00      | 1      |

expected result
--------------------------------
product_id | sort_price | cats |
--------------------------------
| 3        | 23.00      | 31,18|
| 4        | 50.00      | 35,21|
4

2 に答える 2

5

私には、これはあなたが望むもののように聞こえます。あなたは、それらが属するすべてのカテゴリーのリストを含む、特定のカテゴリーにある製品を望んでいます。

SELECT
    cat.product_id, 
    LEAST(IFNULL(NULLIF(saleprice, 0), price),price) AS sort_price,
    GROUP_CONCAT(category_id) AS cats
FROM gc_category_products cat
JOIN gc_products p ON cat.product_id = p.id
WHERE cat.product_id IN
  (SELECT product_id 
   FROM gc_category_products gcp 
   WHERE gcp.category_id IN ('31','35','30','36','37','34'))
AND enabled=1
GROUP BY product_id

PRODUCT_ID   SORT_PRICE   CATS
3            23           31,18
4            50           35,21

テスト用のSQLfiddle

于 2013-01-24T19:13:14.710 に答える
3

このWHEREcategory_idは、結果セットに期待する追加のsを除外します:'18'および'21'。このクエリは、必要な結果セットを生成します。

SELECT
    gc_category_products.product_id, 
    LEAST(IFNULL(NULLIF(saleprice, 0), price),price) AS sort_price,
    GROUP_CONCAT(CONVERT(category_id, CHAR(8))) AS cats
FROM
    (`gc_category_products`)
JOIN `gc_products` ON `gc_category_products`.`product_id` = `gc_products`.`id`
WHERE
       `category_id` = '31'
    OR `category_id` = '35'
    OR `category_id` = '30'
    OR `category_id` = '36'
    OR `category_id` = '37'
    OR `category_id` = '34'
    OR `category_id` = '18' /* added */
    OR `category_id` = '21' /* added */
AND 
    `enabled` = 1
GROUP BY
    `product_id`
LIMIT 10

期待する結果セットを生成するテスト済みの例は、次の場所にあります:http ://sqlfiddle.com/#!2/71a20/17


ただし、クエリには他にも潜在的な問題があることに注意してください。

  1. OR論理演算子のAND優先順位は。よりも低くなります。そのため、クエリが期待どおりに機能しない場合があります。
  2. Joachimが意図を正しく解釈したWHERE場合は、フィルタリングを実行するサブクエリを含めるように句を変更する必要があります。このようにクエリを構成すると、追加のカテゴリが最終結果セットから除外されなくなります。

    WHERE enabled= 1 AND EXISTS(SELECT 1 FROM gc_category_productsas x WHERE xproduct_id= gc_productsid AND。IN ( '31' xcategory_id'35'、 '30'、 '36'、 '37'、 '34'))

この追加の変更は、次の仕様で機能することがテストされています:http ://sqlfiddle.com/#!2/71a20/21/0

于 2013-01-24T18:40:07.873 に答える