2010-08-04 7 views
1

J'essaie de sélectionner la dernière updated (champ) pages (tableau), à l'exclusion des pages masquées (visible = "n"). Cependant, je veux grouper les pages par slug afin que je n'obtienne qu'un résultat par slug.Problème SQL LEFT JOIN

La requête suivante fonctionne un peu, mais il ne sélectionne que la dernière page mise à jour pour chaque limace - puis, si cette page se trouve être caché, il supprime des résultats :( Dans ce cas, je veux juste la dernière page mise à jour avec cette limace qui est visible.

SELECT `p1`.`id` AS `pID`, `p1`.`slug` AS `url`, `p1`.`revision`, `p1`.`title`, `p1`.`published`, `p1`.`updated`, (SELECT COUNT(*) FROM `pages` WHERE `slug` = `url` AND `visible` = "y") AS `revisionCount`, (SELECT COUNT(*) FROM `tests` WHERE `pageID` = `pID`) AS `testCount` 
FROM `pages` `p1` 
LEFT JOIN `pages` `p2` ON `p1`.`slug` = `p2`.`slug` AND `p1`.`updated` < `p2`.`updated` 
WHERE `p2`.`updated` IS NULL AND `p1`.`visible` = "y" 
ORDER BY `p1`.`updated` DESC 
+0

donc vous voulez la dernière page mise à jour et visible pour chaque slug? et je suppose que mis à jour est une date ou int? – MrSoundless

+0

@MrSoundless: mise à jour est une date – naburi

Répondre

1

Cela devrait fonctionner:

SELECT id AS pID, slug AS url, revision, title, published, updated, (SELECT COUNT(*) FROM pages WHERE slug = url AND visible = "y") AS revisionCount, (SELECT COUNT(*) FROM tests WHERE pageID = pID) AS testCount 
FROM pages 
WHERE updated IN (SELECT MAX(updated) FROM pages WHERE visible = "y" GROUP BY slug) AND visible = "y" 
ORDER BY updated DESC 

post-scriptum Qu'est-ce qu'il y a avec tous les backticks?

2

Tel est le cas classique pour GROUP BY. Et parce que dans votre cas, vous ne voulez même pas une page considéré moins qu'il ne soit « visible ', vous allez utiliser la clause WHERE plutôt que la clause HAVING

SELECT MAX(id) as highest_id_for_slug, slug 
FROM pages 
GROUP BY slug 
WHERE visible = 'y' 

Vous pouvez l'utiliser dans une sous-requête, si vous voulez rejoindre ces ids à la table des pages, ou ajouter des champs supplémentaires - il suffit de se rappeler la règle que chaque colonne dans la liste SELECT doit être dans le GROUP BY, ou avoir un agrégat appliqué à celui-ci.

SELECT * FROM pages WHERE pages.id IN (
    SELECT MAX(id) as highest_id_for_slug 
    FROM pages 
    GROUP BY slug 
    WHERE visible = 'y' 
)