0

私は次のようなテーブルを持っています

products            product_attributes
==================  ========================================
| id | name      |  | id | product_id | attribute | value  |
==================  ========================================
| 1  | product 1 |  | 1  | 1          | min       | 2    |
| 2  | product 2 |  | 2  | 1          | max       | 5    |
| 3  | product 3 |  | 3  | 2          | min       | 10   |
| 3  | product 3 |  | 4  | 2          | max       | 15   |
| .. | ...       |  | 5  | 3          | min       | 1    |
==================  | 6  | 3          | max       | 100  |
                    | .. | ...        | ...       | ...  |
                    ========================================

範囲内にあるすべての製品を取得したい

SELECT p.id 
  FROM `products` p INNER JOIN `product_attributes` AS pa ON p.id = pa.product_id   
  WHERE  pa.`min` <= 5 AND  pa.`max` >= 5 GROUP BY p.id

これにより、必要な ID のリストが表示されます。私が仕事をすることができないのは、リストの代わりにIDのTOTALカウントを取得することです。そのため、グループを使用できず、それを行うとカウントが台無しになります。

これを行う唯一の方法は、上記の選択をサブ選択で使用し、結果を数えることですか?

ありがとう

4

4 に答える 4

1

最小値と最大値が異なる行にある上記の構造を考えると、これを使用します。

select count(id) from (
  select p.id
  from
    `products` p INNER JOIN `product_attributes` AS pa
    ON p.id = pa.product_id
  where (pa.attribute='min' and pa.value>=5) OR
        (pa.attribute='max' and pa.value<=5)
  group by p.id
  having count(*)=2
) s
于 2013-01-14T20:01:10.533 に答える
1

クエリで にp.id置き換えるだけです。COUNT(1)

SELECT COUNT(1)
FROM `products` p
INNER JOIN `product_attributes` AS pa
    ON p.id = pa.product_id   
WHERE  pa.`min` <= 5
    AND  pa.`max` >= 5
GROUP BY p.id
于 2013-01-14T19:39:58.300 に答える
0

1 つのアプローチは、eav モデルから情報を抽出する前に、正規化のベニアを eav モデルに適用することです。この場合、次のようになります。

 SELECT product_id
      , MAX(CASE WHEN attribute = 'min' THEN value END) `min` 
      , MAX(CASE WHEN attribute = 'max' THEN value END) `max` 
   FROM product_attributes
  GROUP   
     BY product_id;

 +------------+------+------+
 | product_id | min  | max  |
 +------------+------+------+
 |          1 |    2 |    5 |
 |          2 |   10 |   15 |
 |          3 |    1 |  100 |
 |        ... |  ... |  ... |
 +------------+------+------+

さて、あなたの質問は何でしたか?

于 2013-01-14T19:48:26.697 に答える
0

select ステートメントから select count(*) を試してください。

于 2013-01-14T19:52:28.537 に答える