SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.02.2009 00:30:48

Crazy Demon
Участник
Зарегистрирован: 21.02.2009
Сообщений: 2

Помогите с запросом пожалуйста

Здравствуйте уважаемые. Сабж.

Имеются следующие таблицы:
users - пользователей, с полями:
id, name, city_id, cat_id

catalog - предприятий, с полями:
id, name

city - городов, с полями:
id, name

пользователь может принадлежать предприятию, тогда в таблице users в поле cat_id указан ID предприятия, иначе поле cat_id ='0'
примерно так:
id=1, name='Василий', city_id='1', cat_id='1'
id=2, name='Иван', city_id='2', cat_id='0'

Запрос:
SELECT users.name, catalog.name, FROM users, catalog WHERE users.id = '1' AND catalog.id=users.cat_id

если у пользователя cat_id не '0' - то все нормально выводится, а если cat_id='0' то естественно выдает пустой ответ

Можно ли сделать запрос таким образом, чтобы при выборке если cat_id='0', то выводился город?

пробовал использовать IF() и IFNULL() , но наверное я не так понял их работу...

SELECT users.name, IF(catalog.name, catalog.name, city.name) FROM users, catalog, city WHERE users.id = '1' AND IFNULL(catalog.id=users.cat_id, users.city_id=city.id)


Помогите разобраться.

Заранее премного благодарен, Дмитрий.

Неактивен

 

#2 21.02.2009 02:46:06

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Помогите с запросом пожалуйста

Код:

SELECT `users`.`name`,`catalog`.`name`,`city`.`name`
FROM `users`
LEFT JOIN `catalog` ON `catalog`.`id`=`users`.`cat_id`
LEFT JOIN `city` ON `city`.`id`=`users`.`city_id`
WHERE `users`.`id`=1

Если пользователь не принадлежит никакому предприятию/городу, то в соответствующем поле таблицы `users` должно быть значение NULL, а не 0.

Неактивен

 

#3 21.02.2009 05:23:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Помогите с запросом пожалуйста

SELECT users.name, catalog.name, FROM users, catalog WHERE users.id = '1' AND catalog.id=users.cat_id

если у пользователя cat_id не '0' - то все нормально выводится, а если cat_id='0' то естественно выдает пустой ответ

Можно ли сделать запрос таким образом, чтобы при выборке если cat_id='0', то выводился город?

Во-первых, как уже указано в предыдущем ответе, вам нужно использовать не прямое объединение таблиц (при котором выбираются только те записи, которые имеют соответствие), а left join, чтобы выбрать и те записи для которых нет соответствия в подключаемой таблице.

Функция ifnull(арг1,арг2)  -- возвращает первый аргумент если он не NULL, иначе второй.

Поставленная вами задача имеет следующее решение:


select users.name, ifnull(catalog.name, city.name)
from users
left join catalog on cat_id=catalog.id
left join city on city_id=city.id
where users.id=1;
Вот только неясно как вы будет определять выдан вам город или предприятие. Полагаю, что вы все-таки неверно формулируете задачу изначально.

Если пользователь не принадлежит никакому предприятию/городу, то в соответствующем поле таблицы `users` должно быть значение NULL, а не 0.

Почему? left join и с нулем прекрасно работает.

P.S. Подсветка синтаксиса производится с помощью тега syntax=mysql в квадратных скобках, закрывающий тег /syntax

Неактивен

 

#4 21.02.2009 11:21:42

Crazy Demon
Участник
Зарегистрирован: 21.02.2009
Сообщений: 2

Re: Помогите с запросом пожалуйста

Большое спасибо за помощь - естественно работают оба запроса.
Воспользовался запросом vasya  - через IF() меньше полей выводится smile

2 vasya - Мне не надо определять город это или предприятие - это вывод информации о том, кто редактировал запись, дальше она ни где не обрабатывается.

Неактивен

 

#5 21.02.2009 14:54:46

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Помогите с запросом пожалуйста

vasya написал:

Почему? left join и с нулем прекрасно работает.

Работает конечно ) Это скорее вопрос логики, если нет информации, значит ставим NULL, а сравнение NULL с чем угодно оператором "=" заведомо даёт в результате NULL. Т.е. mysql не нужно будет даже искать такое совпадение в подключаемой таблице.

vasya написал:

P.S. Подсветка синтаксиса производится с помощью тега syntax=mysql в квадратных скобках, закрывающий тег /syntax

Спасибо, буду знать smile

Неактивен

 

Board footer

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