2017-08-14 3 views
1

Hier ist meine Tabellenstruktur:Wie kann ich übereinstimmende Zeilen einzeln zählen?

-- qanda (stands for questions and answers) 
+----+---------+-----------------------------------------------+--------------+-----------+------+ 
| id | title |      content     | question_id | user_id | type | 
+----+---------+-----------------------------------------------+--------------+-----------+------+ 
| 1 | title1 | this is a question       | NULL   | 213423 | 0 | 
| 2 | NULL | this is an answer        | 1   | 435344 | 1 | 
| 3 | NULL | this is another answer      | 1   | 432435 | 1 | 
| 4 | title2 | this is another question      | NULL   | 124324 | 0 | 
| 5 | NULL | this is an answer for the second question  | 4   | 213423 | 1 | 
| 6 | NULL | this is another answer for the first question | 1   | 213423 | 1 | 
+----+---------+-----------------------------------------------+--------------+-----------+------+ 

Ich möchte einzeln die Anzahl der Fragen und Antworten zu zählen. Wie kann ich das machen?

Das erwartete Ergebnis für diesen Benutzer: :user_id = 213423

+--------+--------+ 
| q_num | a_num | 
+--------+--------+ 
| 1  | 2  | 
+--------+--------+ 

ich tun kann, dass durch zwei Abfragen getrennt:

SELECT count(*) q_num FROM qanda WHERE user_id = :user_id AND question_id IS NULL 

SELECT count(*) a_num FROM qanda WHERE user_id = :user_id AND question_id IS NOT NULL 

Kann ich das in einer Abfrage zu tun?

Antwort

3

Sie können einfach tun:

SELECT count(questionid) as q_num, 
     sum(questionid is null) as a_num 
FROM qanda 
WHERE user_id = :user_id ; 

count() mit einer Spalte oder einem Ausdruck die Anzahl der nicht NULL Werte zählt - genau das, was Sie tun möchten. MySQL behandelt boolesche Werte als Ganzzahlen in einem numerischen Kontext, wobei 1 für wahr und 0 für falsch steht.

Man könnte auch schreiben dies als:

(count(*) - count(questionid)) as a_num 

oder

sum(case when questionid is null then 1 else 0 end) as a_num 

EDIT:

select sum(type = 0) as q_num, sum(type = 1) as a_num 
+0

In Ihrem letzten Abfrage gibt es zwei 'a_num'. Einer von ihnen sollte 'q_num' sein. Danke, upvote –

+2

@MartinAJ. . . Das war keine Frage. Das waren zwei Möglichkeiten, dasselbe zu tun. –

+0

Ok, ich habe meine Frage nicht genau genug gestellt. Eigentlich habe ich noch eine Spalte namens 'type'. Es enthält "0" für Fragen und "1" für Antworten. Kannst du mir bitte sagen, wie ich damit umgehen kann? –

1
SELECT 
SUM(question_id IS NULL) a_num, 
SUM(question_id IS NOT NULL) q_num 
FROM qanda 
WHERE user_id = :user_id 
:

Typ verwenden, können Sie eine Variante verwenden

Versuchen Sie die obige Abfrage.

question_id IS NULLquestion_id IS NULL wie in der obigen Abfrage geschrieben hat, wird es 1 für wahr und 0 für falsch generieren, so SUM(question_id IS NOT NULL) wird genaue Anzahl der Frage generieren.

Gleiches ist Arbeit für die Antwort auch.

+0

Wenn Sie alles mit NULL vergleichen, ergibt sich NULL. Um zu testen, ob eine Spalte NULL enthält, verwenden Sie 'IS NULL' oder' IS NOT NULL'. – Pred

+0

@Pred Ja, ich habe es.Und ich hatte meine Antwort korrigiert –

1

Die Verwendung einer SUM mit einer CASE Anweisung wird dies erreichen.

SELECT SUM(CASE WHEN question_id IS NULL 
       THEN 1 
       ELSE 0 
      END) AS q_num, 
     SUM(CASE WHEN question_id IS NOT NULL 
       THEN 1 
       ELSE 0 
      END) AS a_num 
FROM qanda 
WHERE user_id = :user_id 

Ausgang (Für user_id = '213423')

q_num a_num 
1  2 

SQL Fiddle: http://sqlfiddle.com/#!9/4923c/2/0

+0

Danke, upvote –

Verwandte Themen