SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 06.09.2010 09:56:44

mikki11
Участник
Зарегистрирован: 14.03.2010
Сообщений: 14

Помогите с 1 единственным запросом к БД!

Запрос, который должен был на главной странице выводить фирмы и их подтипы, у которых в базе ИМЕЮТСЯ фирмы.

Иерархия:
Тип фирмы->Подтип фирмы (кол-во фирм)
Выглядеть это будет так:

АВТОСАЛОНЫ:
- Продажа авто (2),
- Автовыкуп (1)
- Trade-in (1)

АВТОСЕРВИСЫ
- Шиномонтаж (1)

АВТОУСЛУГИ
- Такси (1)

ДРУГОЕ
- Автокредит (1)
- Автострахование (1)


Проблем бы небыло. За исключением одного: у фирмы - несколько подтипов.
Таблица FIRMS выглядет так:
firm_id 1
firm_type 3
firm_subtypes 1,4,5,8,9
firm_city 'Рязань'
........

Если бы firm_subtypes имел лишь одно значение - то всё бы работало следующим запросом:
SELECT COUNT(*) AS a1, t1.firm_type, t2.ftype_name, t2.ftype_alias, t2.ftype_picture, t3.fsubtype_name, t3.fsubtype_alias FROM ab_firms AS t1, ab_ftypes AS t2, ab_fsubtypes AS t3 WHERE t1.firm_type=t2.ftype_id AND t1.firm_subtypes=t3.fsubtype_id AND t1.firm_checked='on' GROUP BY t1.firm_subtypes, t1.firm_type ORDER BY t2.ftype_name, t3.fsubtype_name

Но firm_subtypes имеет значение '1,2,3,4,7,12,111'...
В этом и засада - приходится делать ...WHERE t3.fsubtype_id IN(t1.firm_subtypes)... - и выводится неверный результат. Надо разобраться. Дамп 3-х таблиц (Фирмы, Типы фирм, Подтипы фирм) - во вложении. Он уже заполнен. А вот и сам мой запрос (некорректный):

SELECT COUNT(*) AS a1, t1.firm_type, t2.ftype_name, t2.ftype_alias, t2.ftype_picture, t3.fsubtype_name, t3.fsubtype_alias FROM ab_firms AS t1, ab_ftypes AS t2, ab_fsubtypes AS t3 WHERE t1.firm_type=t2.ftype_id AND t3.fsubtype_id IN(t1.firm_subtypes) AND t1.firm_checked='on' GROUP BY t3.fsubtype_id, t1.firm_type ORDER BY t2.ftype_name, t3.fsubtype_name

В результате чего, у 1-го автосалона, который относится и к Продаже, и к Автовыкупу, и к Trade-in, должно выводиться как:
АВТОСАЛОНЫ:
- Продажа авто (2),
- Автовыкуп (1)
- Trade-in (1)

выводится лишь 1-й подтип:
АВТОСАЛОНЫ:
- Продажа авто (2)

Жду ответа! Буду благодарен за любую помощь! Дамп с 3 таблицами во вложении!


Прикрепленные файлы:
Attachment Icon ab_orig.sql, Размер: 11,219 байт, Скачано: 828

Неактивен

 

#2 06.09.2010 13:12:20

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

Re: Помогите с 1 единственным запросом к БД!

mikki11 написал:

В этом и засада - приходится делать ...WHERE t3.fsubtype_id IN(t1.firm_subtypes)... - и выводится неверный результат. Надо разобраться.

Сравните результат:

select * from ab_firms t1 join ab_fsubtypes t3
on t3.fsubtype_id IN(t1.firm_subtypes);

и
select * from ab_firms t1 join ab_fsubtypes t3
on t3.fsubtype_id =t1.firm_subtypes;
и найдите 10 отличий wink

У вас не удачно спроектирована база

mikki11 написал:

Но firm_subtypes имеет значение '1,2,3,4,7,12,111'...

Сделайте отдельную табличку соответствия фирм/подфирм.

Неактивен

 

#3 06.09.2010 14:26:11

mikki11
Участник
Зарегистрирован: 14.03.2010
Сообщений: 14

Re: Помогите с 1 единственным запросом к БД!

vasya написал:

У вас не удачно спроектирована база
Сделайте отдельную табличку соответствия фирм/подфирм.

Я знаю, но это будет перебор.... Если 1000 фирм, и для каждой фирмы - 5 подтипов, то для 1 такой фирмы придётся 5 записей вставлять в эту отдельную табличку:
FirmID SubTupeID
1         2
1         5
1         9
1         11
1         12

Неактивен

 

#4 06.09.2010 14:36:06

mikki11
Участник
Зарегистрирован: 14.03.2010
Сообщений: 14

Re: Помогите с 1 единственным запросом к БД!

vasya написал:

Сравните результат:

select * from ab_firms t1 join ab_fsubtypes t3
on t3.fsubtype_id IN(t1.firm_subtypes);

и
select * from ab_firms t1 join ab_fsubtypes t3
on t3.fsubtype_id =t1.firm_subtypes;
и найдите 10 отличий wink

Разные! В 1-м случае - любой из множества (или 1, или 2, или 3), а во 2-м случае - конкретная строка '1,2,3', то есть фирма, относящаяся ко всем 3 подтипам, а не к любому из заданных.

Неактивен

 

Board footer

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