如果只有所有大小等于0,则选择Mysql

时间:2012-04-24 12:50:08

标签: mysql

我有一些mysql表:

`items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_id_p` int(11) NOT NULL,
  `cat_id` int(11) DEFAULT NULL,
  `brand_id` int(11) DEFAULT NULL,
...
)

`items_sizes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `size_id` int(11) NOT NULL,
  `count` int(11) DEFAULT '1',
...
)

我需要选择只有items_sizes.count<的项目。 1,而不是具有至少计数的项目> 1

这是sql查询:

SELECT 
  DISTINCT `items`.* 
FROM 
  (`items2`) 
  LEFT JOIN `items_sizes` ON  items_sizes`.`item_id` = `items`.`id`
WHERE ... 
  AND `items_sizes`.`item_id` = items.id 
  AND `items_sizes`.`count` < 1
GROUP BY `items`.`id` 
ORDER BY `items`.`id` desc
LIMIT 30 

但它不起作用......我可能需要If声明吗?


解决了!只有SUM和HAVING

SELECT DISTINCT `items`.*, sum(items_sizes.count)
FROM (`items`) 
LEFT JOIN `items_sizes` ON `items_sizes`.`item_id` = `items`.`id` 
WHERE ...
GROUP BY `items`.`id` 
having sum(items_sizes.count)=0
ORDER BY `items`.`id` desc LIMIT 30

2 个答案:

答案 0 :(得分:0)

假设您的items2子句中的表名FROM是拼写错误,或者items.*是拼写错误,应该是items2.* ...

您没有聚合函数(SUM(), COUNT(), AVG()),因此不需要GROUP BY。您还可以将WHERE子句与ON中使用的JOIN子句混合使用。第一个WHERE条件不应该存在:

SELECT 
  DISTINCT items2.* 
FROM 
  items2
  LEFT JOIN items_sizes ON  items2.id = items_sizes.item_id
WHERE ... 
  AND items_sizes.count < 1
ORDER BY items2.id desc
LIMIT 30 

请注意,我们未看到的WHERE子句部分(WHERE ...)在此处可能也很重要...

LEFT JOIN可能是不必要的,可以只是JOIN,因为items_sizes.count < 1会消除NULL无论如何都会返回的LEFT JOIN值。

答案 1 :(得分:0)

SELECT 
  DISTINCT * 
FROM 
  `items`
WHERE
  NOT EXISTS (
    SELECT * FROM `items_sizes`
    WHERE
          `items_sizes`.`item_id` = `items`.`id`
      AND `items_sizes`.`count` > 0
  )
  -- ...
ORDER BY `id` desc
LIMIT 30