Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Есть запрос:
Код:SELECT `u`.*, `c`.`title` AS `city`, `p`.`title` AS `phone` FROM `clients` AS `u` LEFT JOIN (SELECT `title`, `client_id` FROM `clients_contacts` WHERE `type` = 1) AS `c` ON `u`.`id` = `c`.`client_id` LEFT JOIN (SELECT `title`, `client_id` FROM `clients_contacts` WHERE `type` = 3) AS `p` ON `p`.`client_id` = `u`.`id`;
Нужно оптимизировать и убрать дубли...
В настоящий момент если у человека 2 телефона и 2 города (типы 3 и 1 соответственно) - происходит вывод 4 строк, а надо выводить только 2...
Так же по возможности реализовать с минимальной нагрузкой на БД.
P.s. этот запрос работает, но выводит слишком много лишнего При 100 городах и 100 телефонах у 1 клиента будет 10 000 строчек на 1 человека, а надо 100.
SELECT
`u`.*,
`c`.`title` AS `city`,
`p`.`title` AS `phone`
FROM
`clients` AS `u`, `clients_contacts` AS `c`, `clients_contacts` AS `p` WHERE `c`.`type` = 1 AND `u`.`client_id` = `p`.`client_id` AND `c`.`client_id` = `p`.`client_id` AND `p`.`type` = 3
GROUP BY `p`.`id`
SELECT
`u`.*,
`s`.`city` AS `city`,
`s`.`phone` AS `phone`
FROM `clients` AS `u`,
(SELECT `c`.`client_id` AS `id`, `c`.`title` AS `city`, `p`.`title` AS `phone` FROM clients_contacts as `c`
LEFT OUTER JOIN clients_contacts AS `p` ON `c`.`client_id` = `p`.`client_id` AND `p`.`type` = 3
WHERE `c`.`type` = 1
GROUP BY `id`, `phone`
UNION
SELECT `c`.`client_id` AS `id`, `c`.`title` AS `city`, `p`.`title` AS `phone` FROM clients_contacts as `c`
RIGHT OUTER JOIN clients_contacts AS `p` ON `c`.`client_id` = `p`.`client_id` AND `p`.`type` = 3
WHERE `c`.`type` = 1
GROUP BY `id`, `phone`) AS `s`
WHERE `s`.`id` = `u`.`id`
GROUP BY `id`,`city`, `phone`
Народ, ну Вы хоть сами попробуйте свои SQL выполнять... Пишите охинею...
konov,
1) ошибка синтаксиса, таблицы `u` не существует
2) group by a.id - выводится 1 строка на каждого клиента, а надо по максимальному количеству городов или телефонов
3) where b.type = 1 and c.type =3 А если нет ни города, ни телефона - клиент в выборку не попадёт вообще
И это я могу написать не выполняя скул. Если выполнить - там ещё пару багов всплывёт.
Denixxx,
простите, а куда пихать изволите? После первого SELECT? Ровным счётом ничего не даёт...
balabolka,
мне ровным счётом побоку сколько временных таблиц MySQL создаст... Я могу ей сказать создать ещё больше... Для ляма записей это всё равно быстрее, чем на PHP.
cthulchu,
зачем Вам дамп базы? Получить базу клиентов?
Пример есть... В конкретном примере выводится 5 строчек (по первому клиенту 4), надо сделать 3 (по первому - 2). Но если очень хотите - добавил в первый пост выгрузку больше... Добавил второй пример ошибки, когда строка не выводится с примерами в теме
SELECT
`u`.*,
`s`.`type` AS `type`,
`s`.`title` AS `contact`
FROM `clients` AS `u`, `clients_contacts` AS `s`
WHERE `u`.`id` = `s`.`client_id` AND `s`.`type` = 1
UNION
SELECT
`u`.*,
`s`.`type` AS `type`,
`s`.`title` AS `contact`
FROM `clients` AS `u`, `clients_contacts` AS `s`
WHERE `u`.`id` = `s`.`client_id` AND `s`.`type` = 3