2010-05-18 4 views
0

Par défaut, parent_id = 0. Je veux sélectionner tous les enregistrements avec parent_id = 0 et seuls les derniers avec parent_id> 0.MySQL: group by et instruction IF

J'ai essayé, mais il n'a pas travail:

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

Je veux dire que s'il y a quelques enregistrements avec parent_id = 2, un seul d'entre eux devrait être de retour. En outre, s'il existe un certain nombre d'enregistrements avec parent_id = 5, un seul d'entre eux est renvoyé. En d'autres termes, il ne devrait pas y avoir plus d'un enregistrement de chaque parent_id en dehors de ceux ayant parent_id = 0.

Quelle pourrait être la solution?

+2

Qu'entendez-vous par "les derniers"? Voulez-vous dire les derniers entrés dans la base de données? – eykanal

+0

Vous devez définir "last" lorsque vous dites "seulement les derniers avec parent_id> 0". Alors quelqu'un peut répondre. – MJB

+0

Que voulez-vous dire par «derniers»? Des articles qui n'ont aucun autre article faisant référence à lui en tant que parent? –

Répondre

1

Si j'ai bien compris votre question, vous avez besoin de tous les enregistrements avec parent_id == 0 et seulement des enregistrements avec la plus grande valeur de colonne 'time' pour les autres parents_id's? Je suppose que parent_id + time est unique.

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

+1 - Je pense que c'est une meilleure version de ce que j'essayais de décrire. Pourrait probablement utiliser UNION ALL plutôt que UNION bien que la clause WHERE ne permette pas les doublons. –

0

Vous fusionnez tous les concepts ensemble. WHERE, GROUP BY, et HAVING faire des choses différentes. Vous avez probablement besoin de lire cette page de manière plus approfondie:

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

Mais si je fais des suppositions sur ce que vous faites ...

Vous voulez probablement commencer cette partie:

SELECT * FROM articles WHERE parent_id > 0

Mais maintenant vous voulez regrouper les articles qui ont le même parent. En supposant que chaque article a une id, peut-être que vous voulez

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

Maintenant, toutes ces lignes sont des valeurs PARENT_ID avec au moins un article de l'enfant, mais si vous vouliez seulement regarder les parents avec plus de 2 articles enfant, vous pouvez alors vouloir:

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

Cela vous montrera l'identité de tous les articles parents avec au moins 2 articles enfants.

0

Je pense que vous voulez le faire comme deux requêtes et rejoindre les résultats avec un UNION. Je n'ai pas vraiment assez d'informations de votre message pour savoir avec certitude à quoi cela ressemblera, mais peut-être quelque chose comme ceci:

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