2016-04-03 28 views
0

Find adlı aşağıdaki tabloya sahibim ve SessionID sayısını "/ topic" ve "/ detail" adlarına sahip isimlerle döndürmek istiyorum. Bu nedenle, yalnızca SessionID = 1'in hem "/ topic" hem de "name" sütununda "/ detail" bulunduğu için benim durumumda 1 döndürmelidir. enter image description hereSQL select problemleri

Aşağıdaki kodu kullanmaya çalıştım ama sanırım GROUP BY'yi yine karıştırdım.

Thx!

  Select count(distinct `SessionID`) 
     from Find 
     where `name` like "/detail%" 
      and `name` like "/topic%" 
     group by `SessionID`, `date` 
     order by `date`; 

Ayrıca, ekran görüntüsünde görünmeyen "date" adlı başka bir sütun da var. Sütun tarihi, SessionID'nin hangi tarihte toplandığını belirtir. Bu nedenle, yukarıda bahsedilen amacım için SessionID tarafından gruplandırılabileceğimi düşündüm ve sonra tarihe göre gruplandırdım. Bu nedenle, her gün SessionID toplantı gereksinimi sayısını bileceğim.

+0

1. Tablonuzun adı, tablonun DB'sinin üstünde yer alıyor mu? 2. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' bir yazım hatası var. "/ Topic" için kontrol etmiyorsunuz. 3. neden her iki gruba göre ve tarihe göre sıralamanız gerekiyor? Tarihe göre gruba gerek var mı? –

+0

Tarih sütunu neyi temsil ediyor? SessionId ile ilgili mi? – maxvv

+0

evet, sessionID ile ilgilidir, SessionID'nin tarihini bildirir. sessionID = 1,2 için "april1" ve sessionID için "april2" deyin. 3 –

cevap

1

Sorgunuzu 2 adımda ayırmanız gerekir. Öncelikle, hem /details% hem de /topic%'u içeren oturumları bulmanız gerekir. Sonra onları sayabilirsin. ad aramasından

Pivot satırlar

SELECT 
    SessionID, 
    MAX(CASE WHEN name LIKE "/detail%" THEN 1 END) AS hasDetail, 
    MAX(CASE WHEN name LIKE "/topic%" THEN 1 END) AS hasTopic 
FROM Find 
GROUP BY SessionID 

alt sorgunun sonucudur:

SessionID hasDetail hasTopic 
--------- --------- -------- 
1   1   1 
2      1 
3   1   

Bu sorgu yazılır

SELECT COUNT(*) 
FROM 
(
    SELECT 
     SessionID, 
     MAX(CASE WHEN `name` LIKE "/detail%" THEN 1 END) AS hasDetail, 
     MAX(CASE WHEN `name` LIKE "/topic%" THEN 1 END) AS hasTopic 
    FROM Find 
    GROUP BY SessionID 
) AS A 
WHERE A.hasDetail = 1 AND A.hasTopic = 1; 

sonucu Kont MySQL veritabanı için ase, SQL Server için T-SQL gibi başka bir SQL ifadesine ihtiyacınız varsa lütfen bana bildirin.

+0

thx için kapsamlı açıklama!Şu anda mysql workbench kullanarak –

+0

m, ur kodu test ve mükemmel çalıştı. –

+0

Rica ederim! Mutlu kodlama;) @yingnanliu –

0

Siz de yakın olduğunuz için tarih ve sayımı farklı sütunlar olarak eklemelisiniz. Bunun gibi:

 Select `SessionID`, `date`, count(*) as number 
    from Find 
    where `name` like "/detail%" 
     or `name` like "/topic%" 
    group by `SessionID`, `date` 
    order by `date`; 
+1

Şaşırdım. Bu, ad sütununun aynı satırda değil, birden çok satırda "/ detail" ve "/ topic" yazmaması nedeniyle işe yaramaz. – DRapp

+0

@DRapp özür dilerim '' '' '' '' 've' ben' düzeltildi. – Hogan