mysql正在尝试使用一对多表获取计数

mysql正在尝试使用一对多表获取计数,mysql,Mysql,我有像这样的桌子 products product_attributes ================== ======================================== | id | name | | id | product_id | attribute | value | ================== ======================================== | 1 | product 1 |

我有像这样的桌子

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  |
                    | .. | ...        | ...       | ...  |
                    ========================================
我想买一系列的产品 我可以使用以下命令成功获取属于范围的ID列表:

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的总计数,而不是一个列表,这样我就不能使用组,然后当我这样做时,它会弄乱计数

唯一的方法是在子选择中使用上面的选择并计算 结果如何

谢谢

只需在查询中将p.id替换为COUNT1即可

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

一种方法是在尝试从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 |
 |        ... |  ... |  ... |
 +------------+------+------+

现在,您的问题是什么?

请尝试从select语句中选择一个select count*。

鉴于上述结构,其中min和max位于不同的行上,我将使用以下方法:

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

能否显示您在哪里使用了COUNTpa.min和pa.max列的查询?还是在不同的一排?谢谢,我想我需要再解释一下。我想要找到的ID总数。所以我会删除组,但是这会弄乱计数,所以现在我想要一个ID计数。因此,在您的示例中,我希望结果为3。在这种情况下,我认为您只需要:从product_attributes中选择COUNTDISTINCT product_id;-或者您可以从上面的查询中获取行计数num_rows。