2

私はいくつかの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 のみを持つアイテムを選択し、少なくとも count > 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ステートメントが必要ですか?


解決しました!JUST with 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
4

2 に答える 2

0

句のテーブル名items2がタイプミスであるか、タイプミスであり、...FROMitems.*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 < 1NULLLEFT JOIN

于 2012-04-24T12:55:08.747 に答える
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 
于 2012-04-24T12:55:26.767 に答える