2010-01-26 1 views
2

Я знаю, что это возможно, но я недостаточно опыт, чтобы знать, как делать подзапросы.
Вот ситуация:Как получить количество конкретных строк из другой таблицы в подзапросе

Table 1: 
+--------------------+--------------------+ 
|    v_id |    v_name | 
+--------------------+--------------------+ 
|     1 |   v_name1 | 
+--------------------+--------------------+ 
| etc... 

Table 2: 
+--------------------+--------------------+ 
|    a_id |    a_name | 
+--------------------+--------------------+ 
|     1 |   a_name1 | 
+--------------------+--------------------+ 
| etc... 

Table 3: 
+--------------------+--------------------+ 
|    v_id |    a_id | 
+--------------------+--------------------+ 
|     1 |     1 | 
+--------------------+--------------------+ 
|     1 |     2 | 
+--------------------+--------------------+ 
|     1 |     3 | 
+--------------------+--------------------+ 
|     2 |     3 | 
+--------------------+--------------------+ 
|     2 |     1 | 
+--------------------+--------------------+ 

Я считаю, что это довольно распространенная ситуация.
Итак, у меня есть уникальные записи в Table 1 и Table 2.
Я хочу, чтобы SELECT все строки от Table 1 и получили (как последнюю ячейку в каждой строке) количество строк с соответствующим значением в Table 3.

Это не работает:

SELECT t1.* , COUNT(SELECT t3.* FROM `table_3` t3 WHERE t3.v_id = t1.v_id) as entries 
FROM `table 1` t1; 

Я уверен, что я собираюсь быть отчитан экспертами здесь, что все это неправильно, но, честно говоря, это то, что я ищу (и некоторые полезные решение!). ;)

ответ

4

Использование:

SELECT t1.*, 
      COALESCE(x.num_rows, 0) AS entries 
    FROM `table 1` t1 
LEFT JOIN (SELECT t3.v_id, 
        COUNT(*) 'num_rows' 
      FROM `table_3` t3 
     GROUP BY t3.v_id) x ON x.v_id = t1.v_id 
+0

+1 Ты меня избил. –

+0

большое спасибо! :) –

3
SELECT t1.* , (SELECT COUNT(*) FROM `table_3` t3 WHERE t3.v_id = t1.v_id) as t3Count as entries 
FROM `table 1` t1; 
+1

подзапрос будет выполняться для каждой строки в наружном выборе, который для больших ResultSets будет влиять на производительность. – davek

+0

На самом деле, если вы посмотрите на планы, используемые почти в каждой системе баз данных в эти дни, вы увидите, что коррелированный подзапрос будет выполнен как соединение. Выполнение этого способа делает более понятным, что разработка значения не будет добавлять или вычитать из числа строк, возвращаемых t1. –

2
SELECT T1.v_id, COALESCE(COUNT(T3.v_id), 0) 
FROM Table1 AS T1 
LEFT JOIN Table3 AS T3 
ON T1.v_id = T3.v_id 
GROUP BY T1.v_id