2014-06-28 3 views
0

Je cette table SQL Fiddleobtenir le dernier enregistrement par catégorie de filtre par date

Table

articles:

+----+----------+ 
| id | name | 
+----+----------+ 
| 1 | Facebook | 
| 2 | Twitter | 
| 3 | Amazon | 
+----+----------+ 

table prix:

+----+-----------+---------+-----------------------------+ 
| id | buy | item_id |    created_at  | 
+----+-----------+---------+-----------------------------+ 
| 1 | 43000 | 1 | June, 18 2014 17:31:04+0000 | 
| 2 | 44000 | 1 | June, 19 2014 17:31:04+0000 | 
| 3 | 30000 | 2 | June, 20 2014 17:31:04+0000 | 
| 4 | 33000 | 2 | June, 21 2014 17:31:04+0000 | 
| 5 | 20000 | 3 | June, 22 2014 17:31:04+0000 | 
| 6 | 21000 | 3 | June, 23 2014 17:31:04+0000 | 
+----+-----------+---------+-----------------------------+ 

Je veux obtenir les derniers prix par article et un avant l'achat du dernier champ basé sur une date de prix

Sortie désirée:

+----+---------+-----------------+---------+ 
| id | buy | last_before_buy | item_id | 
+----+---------+-----------------+---------+ 
| 10 | 45000 |  43000  | 3 | 
| 7 | 33000 |  31000  | 2 | 
| 4 | 23000 |  23000  | 1 | 
+----+---------+-----------------+---------+ 
+0

Vous devez tirer vos données de départ ici, juste pour empêcher la pourriture du lien. Qu'avez-vous essayé? Cela sonne comme si cela commençait par un problème [tag: le plus grand-n-par-groupe], est-ce qu'aucune des réponses standard ne fonctionne? –

+0

@ Clockwork-Muse j'ai ajouté des données, mon problème résolu par Fabricator, tnx – Sam

Répondre

0

Voici une autre façon de le faire:

select a.id, a.buy, b.buy last_before_buy, a.item_id 
from (select * from prices WHERE (created_at <= NOW() - INTERVAL 5 DAY) order by id desc) a 
join (select * from prices order by id desc) b on a.item_id = b.item_id and a.id > b.id 
group by a.item_id; 

fiddle

+0

tnx avec ce que je obtiens le dernier résultat comment pourrais-je obtenir par exemple dernier article avec leur prix de Il ya 1 semaine? – Sam

+0

l'utilisation de 'order by id desc' dans la table dérivée garantit-elle que le plus récent' a.buy' sera sélectionné? – FuzzyTree

+0

@Xengil, pour obtenir arbitrairement le temps, vous changez 'a.id> b.id' en' b.trade_time Fabricator

0

Vous pouvez le faire avec l'affaire substring_index()/group_concat():

select max(id) as id, 
     substring_index(group_concat(buy order by created_at desc), ',', 1) as buy, 
     substring_index(substring_index(group_concat(buy order by created_at desc), ',', 2), ',', -1) as lastbuy, 
     item_id 
from prices p 
group by item_id; 
+0

ajouter cela pour adapter son désir «ordre par ID desc» –

Questions connexes