Помогите написать SQL запрос ))

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Помогите написать SQL запрос ))

Сообщение mitaichik »

Всем привет ) SQL знаю плохо, помогите плиз ))

В общем: есть таблицы:
mark - марка автомобилей (Renault, Opel)
model - модель (Logan, Astra). Связь с маркой по полю mark_id
model_sub - модификация модели (GTI, Compressor), связь с моделью по полю model_id.

SQL запрос должен выводить строку вида:

Renault Latitude (2.0, 2.5), Renault Logan (1.4 MPi, 1.6 MPi, 1.6 16V), Renault Clio (Confort 1.6 МКП5), Renault Megane (1.4, 1.4 16v, 1.6), Renault Megane 2 (K4J, K4M, F4R), Opel Astra (CC, ASD, 4GSi, ER)

Т.е. Марка Модель (список модификаций), Марка Модел (список модификаций), ....

Выводить должен в одну строку, ибо данный запрос предполагается использовать как подзапрос в другом...

Я написал запрос, который формирует нужные данные, но в несколько строк. Т.е. он возвращает вот такое:
Renault Latitude (2.0, 2.5)
Renault Logan (1.4 MPi, 1.6 MPi, 1.6 16V)
Renault Clio (Confort 1.6 МКП5)
Renault Megane (1.4, 1.4 16v, 1.6)
Renault Megane 2 (K4J, K4M, F4R)
Opel Astra (CC, ASD, 4GSi, ER)

Запрос выглядит так:

Код: Выделить всё


SELECT
    CONCAT(
        mark.title, ' ',
        model.title, ' (',
        GROUP_CONCAT(model_sub.title SEPARATOR ', '),
        ')'
    )
            
FROM 
    mark,
    model,
    model_sub
        
WHERE 
    model_sub.model_id= model.id AND
    model.mark_id = mark.id
            
GROUP BY 
    model.id

Вопрос: как это все объеденить в одну строку. Вроде бы все ясно - использовать GROUP_CONCAT + GROUP BU по марке, но они уже используются для обединения модификаций модели.

Вот. Заранее спасибо.
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: Помогите написать SQL запрос ))

Сообщение mitallast »

Не стоит это делать на уровне БД.
Гораздо проще выбрать в виде AR-моделей с реляциями и передать это дело во view.
Нужно стараться делать запросы максимально простыми, логику на уровне БД лучше не реализовывать - расширять производительность БД очень сложно.
chang
Сообщения: 125
Зарегистрирован: 2010.12.03, 20:01

Re: Помогите написать SQL запрос ))

Сообщение chang »

ну можно еще в 1 SELECT обернуть

Код: Выделить всё


SELECT  GROUP_CONCAT(x.qwe SEPARATOR ', ') 
FROM (
SELECT   0 ,
    CONCAT(
        mark.title, ' ',
        model.title, ' (',
        GROUP_CONCAT(model_sub.title SEPARATOR ', '),
        ')'
    ) as qwe
            
FROM 
    mark,
    model,
    model_sub
        
WHERE 
    model_sub.model_id= model.id AND
    model.mark_id = mark.id
            
GROUP BY 
    model.id
) as x
 
ну и немножко чтива о переносе логики в БД
http://habrahabr.ru/blogs/crazydev/113124/
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Помогите написать SQL запрос ))

Сообщение mitaichik »

Спасибо ) Он мне нужен не для модели, а для скармливания Sphinx'y ))
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: Помогите написать SQL запрос ))

Сообщение mitallast »

Sphinx - да, другое дело.
Есть альтернативный способ - временные таблицы. При больших обьемах данных рано или поздно такой запрос с подзапросами начнет тормозить и сфинкс повесит БД.
Я такие проблемы решал при помощи промежуточной временной таблицы.
Создать и заполнить ее можно при помощи нескольких запросов, которые можно разместить в атрибутах sql_query_pre нужного source. Также рекомендую использовать range_id - очень помогает.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Помогите написать SQL запрос ))

Сообщение mitaichik »

Чтоб я не докучал подобными вопросами: Посаветуйте, пожалуйста, книгу по MySQL. Только хорошую, полную. У меня есть "SQL сборник рецептов" от O'Relly, но там основы, а нужно чтоб реально все про все было...

И еще один вопрос:

В одной таблице у меня есть поле id. Есть вторая (зависимость HAS_MANY). Как с пом. SQL выбрать записи из первой таблицы, для которых нет ни одной записи во второй?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Помогите написать SQL запрос ))

Сообщение mitaichik »

И книгу по Sphinx, если есть.... пжалуйста )
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Помогите написать SQL запрос ))

Сообщение Nafania »

В одной таблице у меня есть поле id. Есть вторая (зависимость HAS_MANY). Как с пом. SQL выбрать записи из первой таблицы, для которых нет ни одной записи во второй?
Ммм, LEFT JOIN?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Помогите написать SQL запрос ))

Сообщение mitaichik »

Nafania писал(а):
В одной таблице у меня есть поле id. Есть вторая (зависимость HAS_MANY). Как с пом. SQL выбрать записи из первой таблицы, для которых нет ни одной записи во второй?
Ммм, LEFT JOIN?
Он вроде объединяет, а нужно искать несоответсвие... то есть чтоб в таблице2 не было ни одной записи для таблицы1. Ладно, на днях в Москву поеду - куплю себе хорошую книжку по MySQL, а там разбирусь.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Помогите написать SQL запрос ))

Сообщение Nafania »

тот же left join, только с условием того, чтобы любое поле из таблицы2 is null
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Помогите написать SQL запрос ))

Сообщение mitaichik »

Nafania писал(а):тот же left join, только с условием того, чтобы любое поле из таблицы2 is null
Блин, работет!!!! Спасибо большое!!!!
Ответить