SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 22.06.2011 16:18:11

ulymor
Участник
Зарегистрирован: 22.06.2011
Сообщений: 4

помогите составить запрос к одной таблице

Необходимо составить запрос к таблице users, которая имеет следующие поля: id, name, city (родной город), prim (отзыв пользователя о родном городе). Требуется найти всех пользователей таких, что есть еще люди, родившиеся в этом городе, и хотя бы у одного из них (для каждого города в отдельности) должен быть написан отзыв о своем городе. Сделать это нужно одним запросом без создания дополнительных таблиц. В результате смогла написать следующий запрос, но он не работает, поскольку выборка идет из одной таблицы((

SELECT * FROM users where city IN (SELECT city FROM users group by city having count(city) > 1 AND MAX(prim) IS NOT NULL)

Неактивен

 

#2 22.06.2011 20:13:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите составить запрос к одной таблице

Не очень мне нравится условие

and MAX(prim) IS NOT NULL
smile.


CREATE TABLE `t_4410_users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) not null DEFAULT '' unique,
  `city` varchar(255) not null DEFAULT '',
  `prim` varchar(255),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


insert into `t_4410_users` values
(NULL,'Gorkiy','Grigoriy',null)
,(NULL,'Mihael','Moscow','Moscow city #1')
,(NULL,'Maxim','Moscow',null)
,(NULL,'Nikolay','Novosibirsk','Novosibirsk city')
,(NULL,'Natalia','Novosibirsk','Novosibirsk      city')
,(NULL,'Nikanor','Novosibirsk',null);


SELECT * FROM `t_4410_users` WHERE city IN (SELECT city FROM `t_4410_users` WHERE prim IS NOT NULL GROUP BY city HAVING COUNT(*) >= 1);

Отредактированно deadka (23.06.2011 09:26:01)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 23.06.2011 15:17:58

ulymor
Участник
Зарегистрирован: 22.06.2011
Сообщений: 4

Re: помогите составить запрос к одной таблице

А если таблица будет содержать  запись (NULL,'Gorkiy','Grigoriy','Grigoriy city'), prim будет не NULL и COUNT(*) = 1, но по условию она не подходит, так как есть только один человек из этого города. И еще вопрос, разве допускается использование в запросе и подзапросе имя одной таблицы, у меня из-за этого выдавалась ошибка.

Неактивен

 

#4 23.06.2011 19:20:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите составить запрос к одной таблице

Да, условие должно быть HAVING COUNT(*) > 1, тогда выбираются люди только из Новосибирска.

Я правильно понимаю, что люди из москвы не должны выбираться, поскольку москвичей хоть и два, но отзыв оставил только один из них?

Что касается использования  в запросе и подзапросе одной таблицы - допускается... А мой вариант запроса у Вас не сработал?
Приведите структуру Вашей таблицы (show create table users), сами данные, текст  запроса, ошибку и версию mysql smile.

Отредактированно deadka (23.06.2011 19:21:05)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 24.06.2011 12:12:43

ulymor
Участник
Зарегистрирован: 22.06.2011
Сообщений: 4

Re: помогите составить запрос к одной таблице

По условию, если хотя бы у одного есть отзыв, то выбираются все люди из этого города. То есть из приведенных вами данных условию удовлетворяют все строки кроме (NULL,'Gorkiy','Grigoriy',null).

К сожалению, сейчас не смогу привести номер ошибки, ближе к понедельнику могу точные данные написать. Отдельно выполняла подзапрос, выводился верный список городов. А когда присоединяла условие выбрать всех пользователей, которые родились в этом множестве городов, то выдавалась ошибка проверьте правильность написания запроса как-то так.

Неактивен

 

#6 24.06.2011 14:05:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите составить запрос к одной таблице

SELECT * FROM `t_4410_users` WHERE city IN (SELECT city FROM `t_4410_users`GROUP BY city HAVING COUNT(*) > 1);


Если не подойдёт, то выложите набор данных и требуемый результат, а то я, видимо, не совсем понимаю, является ли пустой отзыв отзывом smile.

Насчет номера ошибки - приведенный мной вариант запроса у Вас без синтаксических ошибок отрабатывает?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 27.06.2011 14:57:12

ulymor
Участник
Зарегистрирован: 22.06.2011
Сообщений: 4

Re: помогите составить запрос к одной таблице

CREATE TABLE `users` (
   `id` int(11) NOT NULL auto_increment,
   `name` varchar(255) not null DEFAULT '',
   `city` varchar(255) not null DEFAULT '',
   `prim` varchar(255),
   PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


insert into `users` values
(NULL,'user1','Moscow,'my city')
,(NULL,'user2','Moscow','Moscow 2')
,(NULL,'user3','Moscow',null)
,(NULL,'user4','Novosibirsk',null)
,(NULL,'user5','Novosibirsk', null)
,(NULL,'user6','Volgograd','Volgograd city');


Требуемый результат -  вывод следующих записей: (NULL,'user1','Moscow,'my city')
                                                                         (NULL,'user2','Moscow','Moscow 2')
                                                                         (NULL,'user3','Moscow',null)


С вариантом запроса SELECT * FROM `users` WHERE city IN (SELECT city FROM `users`GROUP BY city HAVING COUNT(*) > 1) выдается следующая ошибка:
Ответ MySQL: 
#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 city FROM `users` GROUP BY city HAVING COUNT(*) > 1) LIMI

Версия MySQL 4.0.12.

Неактивен

 

#8 27.06.2011 21:56:35

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите составить запрос к одной таблице

Запрос

SELECT * FROM `users` WHERE city IN (SELECT city FROM `users` where prim is not null GROUP BY city HAVING COUNT(*) > 1);


выдаёт результат

+----+-------+--------+----------+
| id | name  | city   | prim     |
+----+-------+--------+----------+
|  1 | user1 | Moscow | my city  |
|  2 | user2 | Moscow | Moscow 2 |
|  3 | user3 | Moscow | NULL     |
+----+-------+--------+----------+
3 rows in set (0.00 sec)

Вроде это то, что требуется? Если нет, то опять же - приведите  новый набор данных и требуемый результат.

Насчет ошибки - почему бы Вам не обновить mysql? К сожалению, у меня нет настолько старой версии, поэтому воспроизвести ошибку затрудняюсь. Но попробуйте с переименовыванием - может быть поможет, вот так.

SELECT out_.* FROM `users` out_ WHERE out_.city IN (SELECT in_.city FROM `users` in_ where in_.prim is not null GROUP BY in_.city HAVING COUNT(*) > 1);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

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