2010-08-13 8 views
0

la première partie de ce problème a été résolue par une bonne aide sur ici hier, mais j'ai lutté aujourd'hui pour compléter la requête dont j'ai besoin. J'essaie de tirer plusieurs colonnes de 5 tables jointes en fonction de certaines conditions, mais je veux que le jeu de résultats ne contienne qu'une seule "entrée de données" par p.id (l'identifiant d'animal de compagnie qui est une clé étrangère dans la table de saisie) - this data_entry devrait avoir le plus grand nombre de tous les data_entries avec ce p.id (ie un animal de compagnie spécifique pourrait avoir des data_entries numérotés 1,2 et 3 - je veux seulement le numéro 3). J'ai le code ci-dessous fonctionne correctement dans la première requête, mais je veux ajouter une clause supplémentaire qui vérifie la date "mise à jour" de l'enregistrement max renvoyé, mais je ne peux pas sembler travailler comment intégrer cette clause correctement.Groupe-sage-max - aide de requête de données hiérarchique

Toute aide serait grandement appréciée:

Cette requête simplifiée fonctionne correctement sur 3 tables jointes (sans la clause de comparaison date)

SELECT `p`.`id`, `o`.`id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY `d`.`number` DESC 

Cependant, lorsque je tente d'ajouter la clause de comparaison de date ci-dessous et les jointures entre les tables supplémentaires, la requête n'effectue pas la comparaison de date par rapport à la colonne "mise à jour" de data_entry avec le nombre MAX, à la place elle vérifie contre le nombre le plus bas.

SELECT `p`.`id` AS `pet_id`, `o`.`id` AS `owner_id`, `o`.`email`, MAX(d.number) 
FROM (`pets` AS `p`, `owners` AS `o`, `data_entries` AS `d`, `k_records_owners` AS `kcro`, `k_records` AS `kcr`) 
WHERE `p`.`owner_id` = `o`.`id` 
AND `p`.`id` = `d`.`pet_id` 
AND `p`.`kc_number` = `kcr`.`do_dg_dog_no` 
AND `kcr`.`pa_breeder_no` = `kcro`.`contact_no` 
AND FROM_UNIXTIME(`d`.`updated`, "%Y-%m-%d") <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), "%Y-%m-%d") 
GROUP BY `p`.`id`, `o`.`id`, `o`.`email` 
ORDER BY MAX(d.number) DESC 

EDIT: dernière tentative - résultats dans Unknown column 'd2.updated' dans 'having'

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr) 
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d.number = d2.number 
GROUP BY p.id, o.id, o.email 
having FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
ORDER BY max_d DESC 
+0

Utilisez des guillemets simples, pas de double: ' AND FROM_UNIXTIME (d.updated, '% Y-% m-% d') <= DATE_FORMAT (DATE_SUB (MAINTENANT(), INTERVAL 25 jour), '% Y-% m-% d') ' –

Répondre

0

essayez ceci:

SELECT p.id AS pet_id, o.id AS owner_id, o.email, MAX(d.number) as max_d, d.updated 
FROM (pets AS p, owners AS o, data_entries AS d, data_entries AS d2, kennel_club_records_owners AS kcro, kennel_club_records AS kcr) 
WHERE p.owner_id = o.id 
AND p.id = d.pet_id 
AND p.kc_number = kcr.do_dg_dog_no 
AND kcr.pa_breeder_no = kcro.contact_no 
AND d2.number = max_d 
AND FROM_UNIXTIME(d2.updated, '%Y-%m-%d') <= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 25 day), '%Y-%m-%d') 
GROUP BY p.id, o.id, o.email 
ORDER BY max_d DESC 
+0

hi ovais - i essayé, mais la comparaison de date HAVING ne compare pas avec le champ d.updated de la dernière (MAX d.number) d ata_entry - la requête fonctionne correctement en dehors de cette clause cruciale, où je suis coincé. D'autres idées? – franko75

+0

introduire une autre se joindre à la table data_entires comme suit DE (animaux de compagnie p, propriétaires AS o, data_entries AS d, data_entries AS d2, k_records_owners AS KCRO, k_records AS KCR) puis dans la clause where d. number = d2.number puis dans la clause having relace d.updated avec d2.updated –

+0

Maintenant résultats dans la colonne Unknown 'd2.updated' dans 'having clause' - J'ai modifié mon post original afin que vous puissiez voir le requête exacte qui provoque cette erreur (merci pour l'aide jusqu'ici) – franko75