MySQL: группировка и оператор IF - PullRequest
0 голосов
/ 19 мая 2010

По умолчанию parent_id = 0. Я хочу выбрать все записи с parent_id = 0 и только последние с parent_id> 0.

Я попробовал это, но это не сработало:

SELECT * FROM `articles`
  IF `parent_id` > 0 THEN
GROUP BY `parent_id`
HAVING COUNT(`parent_id`) >= 1
END;
ORDER BY `time` DESC

Я имею в виду, что если есть несколько записей с parent_id = 2, должна быть возвращена только одна из них. Также, если существует несколько записей с parent_id = 5, возвращается только одна из них. Другими словами, не должно быть более одной записи каждого parent_id, кроме тех, которые имеют parent_id = 0.

Какое может быть решение?

Ответы [ 3 ]

1 голос
/ 19 мая 2010

Если я правильно понял ваш вопрос, вам нужны все записи с parent_id == 0 и только записи с наибольшим значением столбца 'time' для других parent_id? Я полагаю, что parent_id + time является уникальным.

 SELECT a.* FROM `articles` a 
 INNER JOIN 
 (SELECT parent_id, MAX(`time`) AS `time` FROM `articles` WHERE parent_id >0) t
 ON (t.parent_id = a.parent_id AND a.`time` = t.`time`)

 UNION
 SELECT * FROM `articles` WHERE parent_id = 0;
0 голосов
/ 19 мая 2010

Я думаю, что вы хотите сделать это в виде двух запросов и объединить результаты с UNION. Мне не хватает информации из вашего поста, чтобы точно знать, как это будет выглядеть, но может быть что-то вроде этого:

SELECT parent_id, time FROM articles WHERE parent_id = 0
UNION ALL
SELECT parent_id, MAX(TIME) FROM articles WHERE parent_id > 0
GROUP BY parent_id
0 голосов
/ 19 мая 2010

Вы смешиваете все понятия вместе. WHERE, GROUP BY и HAVING делают разные вещи. Возможно, вам нужно прочитать эту страницу более тщательно:

http://dev.mysql.com/doc/refman/5.1/en/select.html

Но если я сделаю некоторые предположения о том, что вы делаете ...

Вы, вероятно, хотите начать с этой части:

SELECT * FROM articles WHERE parent_id > 0

Но теперь вы хотите сгруппировать статьи, имеющие одного и того же родителя. Предполагая, что каждая статья имеет id, возможно, вы хотите

SELECT parent_id, COUNT(*) AS article_count FROM articles WHERE parent_id >= 0 GROUP BY parent_id

Теперь все эти строки будут значения parent_id хотя бы с одной дочерней статьей, но если вы хотите посмотреть только на родителей с более чем двумя дочерними статьями, вы можете захотеть:

SELECT parent_id, COUNT(*) AS article_count
FROM articles
WHERE parent_id >= 0
GROUP BY parent_id
HAVING article_count >= 2

Это покажет вам идентичность всех родительских статей как минимум с 2 дочерними статьями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...