2016-12-29 1 views
1

У меня есть таблица JT со следующими столбцами:MySQL - Количество строк с одинаковыми значениями, но только если имя происходит в другой колонке

Id | Name | Date  
1 | John | 2015-01-01 
2 | Alex | 2016-01-01 
3 | Pete | 2016-01-01 
4 | Alex | 2016-08-08  
5 | John | 2016-08-08 

Я хочу, чтобы подсчитать количество строк с той же датой. Я сделал это с помощью:

$query_21="SELECT Date, COUNT(*) AS total FROM JT GROUP BY Date"; 
$result_21=mysql_query($query_21); 

while($row = mysql_fetch_array($result_21)) { 

    echo $row['Date'] . ":"; 
    echo $row['total'] . "<br>";  
} 

Это прекрасно работает возвращение:

2015-01-01: 1 

2016-01-01: 2 

2016-08-08: 2 

Однако, у меня есть переменная $ Имя, и я хочу, чтобы сделать звонок, чтобы строка только вставленный в результате массив, если $ Name включен в одну из строк во время подсчета. Так что если $ Name = «John» он должен вернуть:

2015-01-01: 1 

2016-08-08: 2 

ответ

1

Это может быть сделано с помощью пункта where используя exists состояние, но так как вы группировки во всяком случае, я думаю, с помощью пункт having может быть более элегантным :

SELECT Date, COUNT(*) AS total 
FROM  jt 
GROUP BY Date 
HAVING (COUNT(CASE name WHEN $name THEN name END) > 0) 

Примечание:
$name должен, конечно, быть связанной переменной в подготовленном заявлении.

+1

Работал идеально - спасибо ;-) – Mamun

0

также можно использовать запрос Mureinik с SUM и без использования COUNT в сочетании с оператором CASE. Я думаю, что этот запрос легче читать и понимать, потому что запрос более компактный.

SELECT 
    total.Date 
, COUNT(*) AS total 
FROM 
    total 
GROUP BY 
    total.Date 
HAVING 
    SUM(total.Name = "John") 
Смежные вопросы