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

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

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

Вы не зашли.

#1 06.03.2014 15:33:07

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

Собрать информацию об объекте

Здравствуйте, есть такая проблема:
Предположим у нас есть 3 таблицы: Car(машина), Wheel(руль), Engine(двигатель), причем Car содержит WheelId и EngineId или может иметь их как null. Соответственно вопрос: как сделать так, чтобы если например мы могли получить данные о руле - мы их получали, если нет, то соответствующие колонки заполнялись нулями или вообще не выдавались в результате.

Заранее спасибо!

Неактивен

 

#2 06.03.2014 15:37:07

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

Re: Собрать информацию об объекте

Здравствуйте.
Вы можете воспользоваться конструкцией ifnull или coalesce.

Чтобы вообще не выдавались в результате - как Вы себе это представляете?


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

Неактивен

 

#3 06.03.2014 16:12:53

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

Re: Собрать информацию об объекте

deadka написал:

Здравствуйте.
Вы можете воспользоваться конструкцией ifnull или coalesce.

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

deadka написал:

Чтобы вообще не выдавались в результате - как Вы себе это представляете?

Ну предположим у нас есть 5 столбцов в Car(включая все idшники) и по 4 в Wheel и Engine. И если idшник Wheel = null, то мы на выдаче получаем 9 столбцов (5 от Car и 4 от Engine). Но если вы подразумевали - как реализовать это, то понятия не имею smile
Я в sql еще совсем зеленый и не в курсе всей полноты функционала.

Неактивен

 

#4 06.03.2014 16:18:44

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

Re: Собрать информацию об объекте

Средствами sql Вы можете получить таблицу только с фиксированным количеством столбцов - какие колонки укажете в select, такие и получите. Вы можете подвергать колонки всяческим преобразованиям типа ifnull - но количество останется. Однако ничто не мешает Вам во первых уже на клиенте отсортировать - во-вторых добавить в запросе условие, например, WHERE Wheel IS NOT NULL.

Если нужно в "менее общем виде" - приведите
структуру таблиц,
небольшой набор тестовых данных,
то, что получается сейчас в результате запроса,
то, что хочется получить в итоге.


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

Неактивен

 

#5 06.03.2014 16:37:34

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

Re: Собрать информацию об объекте

Cars
Engines
Wheels

Соответственно, если мы например хотим получить Car с id = 2, то мы должны получить набор свойств машины, руля и двигателя при котором все 3 колонки параметров руля равны null.

Неактивен

 

#6 06.03.2014 19:35:58

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

Re: Собрать информацию об объекте

Базовый запрос, который надо расширять в случае потребности:

SELECT
      c.*, e.*,w.*
FROM
    Cars c
    JOIN Wheels w ON c.WheelId = w.id
    JOIN Engines e ON c.EngineId = e.id


Этот запрос выдаст полную информацию из всех таблиц для тех машин, у которых "есть и двигатель и колеса", то есть задан WheelId и EngineId.

Если нужен расширенный вариант, то JOIN заменяется на LEFT JOIN, тогда в выборке будут все машины, даже те, у которых нет движка/колес, соответствующия поля будут NULL.

Дальше на уровне WHERE отфильтровываете нужные записи.


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

Неактивен

 

#7 08.03.2014 11:24:59

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

Re: Собрать информацию об объекте

Спасибо!

Неактивен

 

Board footer

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