2016-04-02 10 views
0

farklı koşullar ile aynı tabloların ikisini katılmak için;SQLITE sorgu aşağıdaki gibi detaylara sahip <code>messages</code> denilen bu SQL tablosu var

id, sender, recipient, message, timestamp 

"1","10204456572654160","10208819391147662","Hi.. : What are you up to?","1459541723279" 
"2","10204456572654160","10208819391147662","Got my test message?","1459541749818" 
"3","10208819391147662","10204456572654160","This is my message","1459611679108" 
"4","10208819391147662","10204456572654160","And another message","1459611735455" 
"5","10204456572654160","10208819391147662","And I reply like this","1459611758570" 
"6","10153775515332771","10208819391147662","It's me.. Syco !!","1459611900348" 
"7","10153775515332771","10208819391147662","You there?","1459611900350" 
"8","10208819391147662","10153775515332771","Yes.. What's upp..","1459611900380" 
"9","10204464403169266","10208819391147662","How're you doin?","1459612000666" 

Şimdi, benim işlevine e.g. 10208819391147662 bir değer geçirmesi için ve sütunları aşağıdaki gibi bir sonuç göstermek istiyorum; DEĞİLDİR sender/recipient ait

  1. Benzersiz değer10208819391147662
  2. son messageolan sender/recipient arasındaki DEĞİL10208819391147662VE 10208819391147662 olduğunusender/recipient.
  3. 2. (mesaj) arasında timestamp.
  4. aşağıdakileri elde etmek amacıyla,

, bu SQL sahiptir;

SELECT s1.*, max(c2.message), max(c2.timestamp) 
FROM (
    SELECT sender as username 
    FROM messages 
    WHERE sender <> '10208819391147662' 
    UNION 
    SELECT recipient as username 
    FROM messages 
    WHERE recipient <> '10208819391147662' 
) s1 
LEFT JOIN messages c2 ON (s1.username = c2.sender OR s1.username = c2.recipient) 
GROUP BY s1.username 

I başarıyla UNION kullanarak 1st column ekstre var. Ama MAX ve Group by maddesini kullanarak 2 ve 3 üzerinde hiçbir lucks ile.

Benim nihai beklenen sonucu olmalıdır;

username, message, timestamp 

"10204456572654160","And I reply like this","1459611758570" 
"10153775515332771","Yes.. What's upp..","1459611900380" 
"10204464403169266","How're you doin?","1459612000666" 

Ve işte benim şu an SQLFiddle. Herhangi bir öneri takdir edilir.

+0

Sen soruyu başka sözcüklerle gerekir. Bazılarının okunması çok zor, yani '10208819391147662 olan gönderici/alıcı arasındaki son mesaj ve 10208819391147662 olan gönderici/alıcı. 'Tek bir paragraf yazabilir, verilerin ne olduğunu ve ne yapmaya çalıştığınızı açıklayabilir misiniz? gereklilik kısmi bir uygulama değildir. – Harry

+1

Lütfen etiketleri doğru şekilde kullanın. mysql <> sql-server <> sqlite – FLICKER

+0

Ne için MAX'a ihtiyacınız var? –

cevap

0

Aslında nihayet bu, istediğimi gerçekleştiren son SQL'tir.

SELECT c2.id, s1.username, c2.message, max(c2.timestamp) 
FROM (
    SELECT sender as username 
    FROM messages 
    WHERE sender <> '10208819391147662' 
    UNION 
    SELECT recipient as username 
    FROM messages 
    WHERE recipient <> '10208819391147662' 
) s1 
LEFT JOIN messages c2 ON (s1.username = c2.sender OR s1.username = c2.recipient) 
GROUP BY s1.username 
ORDER BY timestamp DESC 

Ama MYSQL beklenen ancak henüz SQLITE iyi çalışır olarak her nasılsa, SQLFiddle yılında, bu işe yaramaz.

+0

arasındaki son 'iletiyi' ve 'zaman damgasını' almak istiyorum. SQLite, diğer sütunların MAX() ile aynı satırdan geldiğini garanti eder. MySQL, bazı rasgele satırlardan sütun değerleri döndürür; Diğer veritabanları bunu tamamen yasakladı. –

İlgili konular