2013-02-04 3 views
-1

J'ai deux tables dont une est mise à jour quotidiennement. Je voudrais afficher "seulement" le dernier enregistrement pour chaque ligne.Afficher uniquement l'enregistrement le plus récent pour chaque ligne dans MySQL db en utilisant PHP

C'est la requête que j'utilise maintenant qui renvoie bien sûr tous les enregistrements.

SELECT * 
FROM ss_pumps, secondary_systems WHERE ss_pumps.id=secondary_systems.segment_id 
ORDER BY id ASC 

Toute aide serait grandement appréciée!

+0

Comment vos tables sont-elles liées les unes aux autres? –

+0

le "id" sur ss_pumps est le "segment_id" sur secondary_systems – bech64

Répondre

-2

Voici ce que je suis:

SELECT * 
FROM 
    ss_pumps ssp 
    LEFT JOIN (SELECT * FROM secondary_systems ORDER BY id DESC) ss ON (ssp.id = ss.segment_id) 
GROUP BY 
    ssp.id 
ORDER BY 
    ssp.id ASC 

OPPOSITION: Je suppose que le secondary_systems a son propre champ id cela aussi autoincrements. C'est la seule façon de vous assurer que vous obtenez "seulement" le dernier enregistrement pour chaque ligne.


Démo:http://sqlfiddle.com/#!2/f816b/2/0

Dans ma démo ss_pumps a tenu les parents pendant secondary_systems tenaient les enfants. Chaque parent a 3 enfants. Tous sauf les derniers enfants sont des garçons. Le dernier enfant est toujours une fille. Selon votre problème, la requête qui en résulte ne devrait donner que des filles.

| ID | PARENT | SEGMENT_ID | CHILD | 
------------------------------------ 
| 1 | mother |   1 | betty | 
| 2 | father |   2 | tina | 
+0

Je n'avais pas d'ID automatique dans secondary_systems. Je l'ai ajouté, et à la surprise de personne, mais le mien IT WORKED! – bech64

+0

Merci pour votre temps Ayman – bech64

+1

soyez prudent avec le retour des enregistrements sur la table 'secondary_systems'. – Walter

1

Utilisez cette requête:

SELECT * FROM ss_pumps, secondary_systems WHERE ss_pumps.id=secondary_systems.segment_id ORDER BY id DESC LIMIT 1

Cela suppose que id est une colonne d'incrémentation automatique et sera toujours inséré dans l'ordre.

+0

Oui, il est auto id. La requête que vous postez ne renvoie qu'un seul enregistrement, pas le plus récent pour chaque ligne. – bech64

+0

la table secondary_systems n'a pas un ID d'incrémentation automatique – bech64

3

Vous pouvez trouver le dernier enregistrement pour chaque segment_id par ID en utilisant la sous-requête. Le résultat de la sous-requête est ensuite joint aux deux tables: ss_pumps et secondary_systems.

SELECT a.*, c.* 
FROM ss_pumps a 
     INNER JOIN 
     (
      SELECT segment_id, MAX(datefield) max_val 
      FROM secondary_systems 
      GROUP BY segment_id 
     )b ON a.id = b.segment_id 
     INNER JOIN secondary_systems c 
      ON b.segment_id = c.segment_id AND 
       b.max_val = c.datefield 

En fait, je ne sais pas comment vos tables: ss_pumps et secondary_systems sont liés les uns aux autres.

Je pense que vous voulez les autres moyens,

SELECT a.*, b.* 
FROM secondary_systems a 
     INNER JOIN ss_pumps b 
      ON a.segment_ID = b.segment 
     INNER JOIN 
     (
      SELECT segment, MAX(ID) max_val 
      FROM ss_pumps 
      GROUP BY segment 
     ) c ON b.segment = c.segment AND 
       b.ID = c.max_val 
+0

ne pourriez-vous pas simplement faire un GROUP BY ID_ID ORDER BY id ASC sur la requête d'origine et obtenir le même résultat? – Dave

+0

Non, qu'en est-il des autres colonnes? –

+0

sans savoir quelles sont ses données, nous ne pouvons pas dire avec certitude si les colonnes ont des données différentes ou non. mais un groupe par sur un ID et un tri sur l'ID primaire devrait ramener le dernier de la sous-table aussi une fois rejoint. – Dave

Questions connexes