[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с избыточностью данных
maximka787
Всем привет. Не могу разобраться, есть две таблицы.

tab1 (машины): id, name, ... и еще 10 полей описаний.
1 | bmw | ...
2 | audi | ...
3 | nissan | ...

tab2: (модели): id, brand_id, model
1 | 1 | x5
2 | 1 | x6
3 | 2 | a4
4 | 3 | almera
5 | 3 | murano
6 | 3 | juke

Как грамотней вывести таблицу на странице (php) именно в таком виде?

1 | bmw | x5, x6
2 | audi | a4
3 | nissan | almera, murano, juke


МЕТОД 1: По идее, проще всего делать так:
SELECT * FROM `tab1`, `tab2` WHERE `tab1`.`id` = `tab2`.`id`
Но в этом случае MYSQL выдаст гигантский массив из повторяющихся 15 полей первой таблицы и последняя ячейка будет меняться. Получим большой избыток данных повторяющихся. Конечно в php данные сольются в едино, но все же это большой избыток.

МЕТОД 2: Сделать подзапрос на последнее поле
SELECT `n1`, `n2`, (SELECT `model` FROM `tab2` WHERE ``)
FROM `tab1` WHERE `tab1`.`id` = `tab2`.`id` Как то так.

МЕТОД 3: Собрать все id после первого запроса MYSQL. И потом сделать второй запрос ко второй таблице моделей
a ) SELECT * FROM `tab1` (получим основную таблицу, без последней ячейки (моделей). Вытащим id-ки)
b ) SELECT * FROM `tab2` WHERE `id` IN (через запятую все id-ки)
c ) соединим массивами в самом php.

В общем есть наверно и еще проще способ и грамотней. Можете посоветовать что пришло в голову?

_____________
..Работает - не трогай!
bestxp
Всё верно с 3 случаем

Есть group concat , но ИМХО он подойдет только если ты захочешь вывести строку, а если большее для тех данных, тогда только вариант 3
Valick
SELECT t.id, t.name, g.grc FROM tab1 t LEFT JOIN (SELECT `brand_id`, GROUP_CONCAT(`model`) grc FROM tab2 GROUP BY `brand_id`) g ON t.id = g.brand_id


_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Цитата
Всё верно с 3 случаем

blink.gif кто ты и зачем ты украл аккаунт bestxp??? smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
maximka787
Valick
Да вариант рабочий. Супер.

Я тоже дела делал и вот что сделал)
SELECT
`t1`.`id`,
`t1`.`name`,
(

SELECT GROUP_CONCAT(`t2`.`model` SEPARATOR ', ')
FROM `t2`
WHERE `t2`.`auto` = `t1`.`id`
) AS `models`
FROM
`t1`
немного изменил поля, но не суть.

По скорости вроде совпадают, осталось проверить на большой таблице. Где 200 брендов и больше 600 моделей

bestxp
Третий вариант кажется немного не грамотным. Но по сути работает)

_____________
..Работает - не трогай!
Valick
Цитата
Третий вариант кажется немного не грамотным

это вообще не вариант
Цитата
осталось проверить на большой таблице. Где 200 брендов и больше 600 моделей

это мизерная таблица smile.gif
если хотите нормально проверять, то вам придется делать сурогат эдак по миллиону строк хотябы
__
но забегая вперед я вам сразу могу сказать чей вариант быстрее))


_____________
Стимулятор ~yoomoney - 41001303250491
linker
Вариант maximka787 быстрее.


_____________
Gear Framework
Gear Framework на Github
bestxp
Цитата (Valick @ 13.01.2014 - 13:05)
Цитата
Всё верно с 3 случаем

blink.gif кто ты и зачем ты украл аккаунт bestxp??? smile.gif

я это я

в случае когда связи 1 ко многим 3 вариант самый оптимальный

получили список того что выводим
вторым запросом получили список того что нужно от "многого" where field in (список id-шников первого )
склеили с первым, вывод

итого за 2 запроса забираем данные, зачем это надо ?
Ну например при клике на x5 сделать ссылку на просмотр x5 у неё то уже свой id
и тд
Valick
linker, ну при использовании лимита да, согласен


_____________
Стимулятор ~yoomoney - 41001303250491
linker
Valick
Без лимитов.

_____________
Gear Framework
Gear Framework на Github
killer8080
а что простой вариант с джойном не подходит?

SELECT `t1`.`id`,`t1`.`name` GROUP_CONCAT(`t2`.`model`) `models`
FROM `tab1` `t1`
LEFT JOIN `tab2` `t2` ON `t2`.`brand_id` = `t1`.`id`
GROUP BY `t1`.`id`
maximka787
Ребят, есть только проблема. Делаю запрос в phpmyadmin, вижу две части экрана.
Цитата
Показывает записи 0 - 22 (23 всего, Запрос занял 0.0084 сек)
Далее мой запрос SQL-запрос: .....

Но данных в таблице не вывел. Чуть ниже:
Цитата
SHOW KEYS FROM

Ответ MySQL: Документация
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Причем самое неприятное, что это появляется только когда первый раз делаю запрос. Если сделаю к примеру отдельно подзапрос то будет вывод. И сразу после этого подзапроса еще раз впишу в поле полный запрос то выдаст результат без ошибок. Создается ощущение, что глючит уже сам phpmyadmin

Не знаете в чем проблема может быть?

Если что:
MySQL - 5.0.24a-community-nt
phpMyAdmin - 2.8.2.4

_____________
..Работает - не трогай!
Valick
Цитата
Создается ощущение, что глючит уже сам phpmyadmin

это вряд ли


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.