Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте уважаемые. Сабж.
Имеются следующие таблицы:
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)
Помогите разобраться.
Заранее премного благодарен, Дмитрий.
Неактивен
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.
Неактивен
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, иначе второй.
Поставленная вами задача имеет следующее решение:
Если пользователь не принадлежит никакому предприятию/городу, то в соответствующем поле таблицы `users` должно быть значение NULL, а не 0.
Почему? left join и с нулем прекрасно работает.
P.S. Подсветка синтаксиса производится с помощью тега syntax=mysql в квадратных скобках, закрывающий тег /syntax
Неактивен
Большое спасибо за помощь - естественно работают оба запроса.
Воспользовался запросом vasya - через IF() меньше полей выводится
2 vasya - Мне не надо определять город это или предприятие - это вывод информации о том, кто редактировал запись, дальше она ни где не обрабатывается.
Неактивен
vasya написал:
Почему? left join и с нулем прекрасно работает.
Работает конечно ) Это скорее вопрос логики, если нет информации, значит ставим NULL, а сравнение NULL с чем угодно оператором "=" заведомо даёт в результате NULL. Т.е. mysql не нужно будет даже искать такое совпадение в подключаемой таблице.
vasya написал:
P.S. Подсветка синтаксиса производится с помощью тега syntax=mysql в квадратных скобках, закрывающий тег /syntax
Спасибо, буду знать
Неактивен