maximka787
13.01.2014 - 12:24
Всем привет. Не могу разобраться, есть две таблицы.
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
13.01.2014 - 13:00
Всё верно с 3 случаем
Есть group concat , но ИМХО он подойдет только если ты захочешь вывести строку, а если большее для тех данных, тогда только вариант 3
Valick
13.01.2014 - 13:03
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
13.01.2014 - 13:05
Цитата |
Всё верно с 3 случаем |

кто ты и зачем ты украл аккаунт bestxp???
_____________
Стимулятор ~yoomoney - 41001303250491
maximka787
13.01.2014 - 13:08
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
13.01.2014 - 13:28
Цитата |
Третий вариант кажется немного не грамотным |
это вообще не вариант
Цитата |
осталось проверить на большой таблице. Где 200 брендов и больше 600 моделей |
это мизерная таблица

если хотите нормально проверять, то вам придется делать сурогат эдак по миллиону строк хотябы
__
но забегая вперед я вам сразу могу сказать чей вариант быстрее))
_____________
Стимулятор ~yoomoney - 41001303250491
linker
13.01.2014 - 13:37
Вариант
maximka787 быстрее.
_____________
Gear FrameworkGear Framework на Github
bestxp
13.01.2014 - 13:40
Цитата (Valick @ 13.01.2014 - 13:05) |
Цитата | Всё верно с 3 случаем |
 кто ты и зачем ты украл аккаунт bestxp??? |
я это я
в случае когда связи 1 ко многим 3 вариант самый оптимальный
получили список того что выводим
вторым запросом получили список того что нужно от "многого" where field in (список id-шников первого )
склеили с первым, вывод
итого за 2 запроса забираем данные, зачем это надо ?
Ну например при клике на x5 сделать ссылку на просмотр x5 у неё то уже свой id
и тд
Valick
13.01.2014 - 14:05
linker, ну при использовании лимита да, согласен
_____________
Стимулятор ~yoomoney - 41001303250491
linker
13.01.2014 - 14:26
killer8080
13.01.2014 - 14:34
а что простой вариант с джойном не подходит?
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
13.01.2014 - 18:00
Ребят, есть только проблема. Делаю запрос в 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
13.01.2014 - 18:54
Цитата |
Создается ощущение, что глючит уже сам phpmyadmin |
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.