SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.11.2008 16:03:52

DmitriyZ
Участник
Зарегистрирован: 06.11.2008
Сообщений: 5

Подзапрос. COUNT(*)

Здравствуйте.

Есть две таблицы:

1) CREATE TABLE `table1` (
`table1_id` INT NOT NULL
) TYPE = MYISAM ;

2. CREATE TABLE `table2` (
`table1_id` INT NOT NULL,
`table2_id` INT NOT NULL
) TYPE = MYISAM ;

Требуется выполнить следующий запрос:

SELECT table1_id, (SELECT COUNT( * ) FROM table2  WHERE table1.table1_id = table2.table1_id) AS res
FROM table1

Пишет ошибку (#1064 - You have an error in your SQL syntax). Версия Mysql 4.1
Как обойти?

Неактивен

 

#2 26.11.2008 18:45:31

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Подзапрос. COUNT(*)

Подробнее ошибку приведите

Неактивен

 

#3 26.11.2008 21:42:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подзапрос. COUNT(*)

И заодно - чем плохо вот так?

SELECT table1_id, COUNT(*) as RES
FROM table1 JOIN table2 USING (table1_id)
GROUP BY 1;

Неактивен

 

#4 27.11.2008 10:25:53

DmitriyZ
Участник
Зарегистрирован: 06.11.2008
Сообщений: 5

Re: Подзапрос. COUNT(*)

Так пишет след. ошибку:

#1052 - Column: 'table1_id' in field list is ambiguous

По поводу первого запроса:
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT( * ) FROM table2 WHERE table1.table1_id = table2.t

Работает след. образом:
SELECT table1.table1_id, COUNT( table2.table1_id ) AS res
FROM table1 LEFT JOIN table2
ON table1.table1_id = table2.table1_id
GROUP BY 1

А если у меня есть еще таблица из которой нужно вывести кол-во записей:

3. CREATE TABLE `table3` (
`table1_id` INT NOT NULL,
`table3_id` INT NOT NULL
) TYPE = MYISAM ;

И в результате нужно:

SELECT table1_id,
(SELECT COUNT( * ) FROM table2 WHERE table1.table1_id = table2.table1_id) AS res,
(SELECT COUNT( * ) FROM table3 WHERE table1.table1_id = table3.table1_id) AS res2
FROM table1

Отредактированно DmitriyZ (27.11.2008 11:36:18)

Неактивен

 

#5 27.11.2008 13:11:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подзапрос. COUNT(*)

SELECT table1.table1_id, COUNT(*) AS RES
FROM table1 JOIN table2 USING (table1_id)
GROUP BY 1;

smile

А вообще - Вы что-то посылаете не то, т.к. он ругается уже на слово SELECT. Возможно, не посылаете
предыдущий запрос (забыли точку с запятой или еще что-то).

Неактивен

 

#6 27.11.2008 13:29:17

DmitriyZ
Участник
Зарегистрирован: 06.11.2008
Сообщений: 5

Re: Подзапрос. COUNT(*)

Так как все-таки еще одну таблицу прикрепить?

Неактивен

 

#7 27.11.2008 13:50:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подзапрос. COUNT(*)

SELECT table1.table1_id, COUNT(table2_id) AS res, COUNT(table3_id) AS res2
FROM table1
JOIN table2 USING (table1_id)
JOIN table3 USING (table1_id)
GROUP BY 1;

Неактивен

 

#8 27.11.2008 13:58:34

DmitriyZ
Участник
Зарегистрирован: 06.11.2008
Сообщений: 5

Re: Подзапрос. COUNT(*)

Я уже так пробывал.
выводит в res и res2, как результат res*res2

Неактивен

 

#9 27.11.2008 14:21:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подзапрос. COUNT(*)

Да, действительно sad Тогда только подзапросом sad

mysql> create table a (a int);
Query OK, 0 rows affected (0.02 sec)

mysql> create table b (b int, a int);
Query OK, 0 rows affected (0.00 sec)

mysql> create table c (c int, a int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert a values (1), (2);
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert b values (1,1),(1,2),(2,1),(2,2);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert c values (1,1),(2,1),(3,1),(1,2),(2,2),(3,2);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select a.a, count(b), count(c) from a join b using (a) join c using (a) group by 1;
+------+----------+----------+
| a    | count(b) | count(c) |
+------+----------+----------+
|    1 |        6 |        6 |
|    2 |        6 |        6 |
+------+----------+----------+
2 rows in set (0.04 sec)

mysql> select a, (select count(*) from b where b.a=a.a), (select count(*) from c where c.a=a.a) from a;
+------+----------------------------------------+----------------------------------------+
| a    | (select count(*) from b where b.a=a.a) | (select count(*) from c where c.a=a.a) |
+------+----------------------------------------+----------------------------------------+
|    1 |                                      2 |                                      3 |
|    2 |                                      2 |                                      3 |
+------+----------------------------------------+----------------------------------------+
2 rows in set (0.02 sec)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson