Форум → Программирование → PHP для идиотов → JOIN в SQL запросах
JOIN в SQL запросах
-
Недопру никак уже 5 часов как запрос составить.
есть 4 таблицы:
tov_1 и tov_2 содержат товары. ctr_1 и ctr_2 содержат значения ctr для товаров из первых двух таблиц, соответственно. Нужно найти соответствие для каждой пары в запросе. Запрос:
SELECT t1.id, c1.id, t2.id, c2.id FROM ctr_1 AS c1, tov_1 AS t1, ctr_2 AS c2, tov_2 AS t2
WHERE c1.query_id='31' AND c1.id=t1.id AND c2.query_id='31' AND c2.id=t2.id
ORDER BY c1.ctr, c2.ctr
Возвращает гадкие результаты. Т.к. кол-во предметов в товарных таблицах разное, там где их меньше, они дублируются. -
11 марта 2011 г. 17:43, спустя 10 минут 46 секунд
gooddaytoday, используй JOIN и GROUP BY.
Пример:SELECT `articles`.`title`, `articles`.`content`, `comments`.`comment` FROM `articles` JOIN `comments` ON (`articles`.`id` = `comments`.`id_article`) GROUP BY `articles`.`id` ORDER BY `articles`.`id` DESC1
-
11 марта 2011 г. 20:32, спустя 2 часа 49 минут 58 секунд
SELECT t1.id, c1.id, t2.id, c2.id
FROM ctr_1 AS c1, tov_1 AS t1, ctr_2 AS c2, tov_2 AS t2
WHERE c1.query_id='31' AND c1.id=t1.id AND c2.query_id='31' AND c2.id=t2.id
GROUP BY t1.id, t2,id
ORDER BY c1.ctr, c2.ctr
возвращает тот же самый результат. Очевидно, придется делать логику с помощью вспомогательных таблиц…. -
11 марта 2011 г. 23:59, спустя 3 часа 26 минут 28 секунд
Да этож ад полный.
посмотрел Внимательно, что придется сделать - так вышло, что всю архитектуру опять заново менять придется. А кажется что уже крикнули с мачты долгожданное "Земля!!!!!!!" а тут такой медный таз пришел моим надеждам. -
12 марта 2011 г. 13:40, спустя 13 часов 40 минут 55 секунд
Понял как надо. Уже почти алиллуя.
Запрос:
(SELECT t1.id,c1.ctr ….)
UNION
(SELECT t2.id,c2.ctr ….)
UNION
……..
ORDER BY ctr;
Только теперь другая проблема. Мне необходимо возвращать для каждой строки имя таблицы. Просто писать в селект? Не кактит, ибо кол-во таблиц для выборки разное всегда. -
12 марта 2011 г. 13:52, спустя 12 минут 32 секунды
Иногда разделы для новичков это места, где последние занимаются онанизмом своего говнокода :)
Не подумал сперва, когда писал пред. сообщение.
(SELECT 'table_1' AS table, t1.id, c1.ctr ….)
UNION
(SELECT 'table_1' AS table, t2.id, c2.ctr ….)
UNION
……..
ORDER BY ctr; -
19 мая 2011 г. 13:31, спустя 67 дней 22 часа 39 минут
Дабы однообразные темы не плодить, задам вопрос здесь :)
Хочу за раз выбрать из нескольких таблиц все нужные мне данные. Решил сделать через UNION
Получилось вот что:(SELECT count(id) AS `user` FROM `user`) UNION (SELECT count(`id`) AS `online` FROM `user` WHERE `lastlogin` > '".(time() - 600)."') UNION (SELECT count(id) AS `video` FROM `video`)
Не знаю на сколько правильно. Но задача получить общее кол-во пользователей, пользователей онлайн и кол-во записей в таблице видео. В дальнейшем еще еще планирую несколько запросов сюда же дописать.
Ну данные из первой таблицы он мне вроде выводит, а вот дальше пустота. К тому же я фиг знает как в таком случае правильно данные выводить :) думал сделать $row = mysql_fetch_assoc($result) и получить user, online, video но фиг там.
Подскажите что делаю не так и в каком направлении копать, а то опять придется всё в 10 запросов отдельных совать.from TRIAL with LOVE -
-
19 мая 2011 г. 13:46, спустя 4 минуты 48 секунд
Ну я тоже не думаю что разница между джойнами и отдельными запросами настолько велика. Просто как-то всё советуют всё в одном запросе по возможности извлекать. Вот и решил попробовать. Теперь хочу понять что не так делаю.from TRIAL with LOVE -
19 мая 2011 г. 15:29, спустя 1 час 42 минуты 39 секунд
результирующее поле(я) должно быть одно при использовании UNION
у тебя:
AS `user`
AS `online`
AS `video`
Спустя 229 сек.суть UNION'a - несколько селектов, различающихся условиями WHERE и имеющих одинаковый результирующий набор полей -
19 мая 2011 г. 15:56, спустя 27 минут 27 секунд
вообще я с джоинами обычно экспериментирую… ибо в зависимости от архитектуры БД, схемы, количества данных и требуемых данных могут подходить совершенно разные варианты… нет чёткого правила… когда то применили 5 запросов вместо одного и получили выигрышь очень неплохой… -
19 мая 2011 г. 16:45, спустя 48 минут 59 секунд
Faster, ок буду знать. попробую везде поставить AS `result` напримерfrom TRIAL with LOVE -
19 мая 2011 г. 18:16, спустя 1 час 30 минут 59 секунд
жойны гавно, бд гавно, рулит тру мемори акесс и ява, все остальный сосут хуй и тп xDСапожник без сапог -
-
19 мая 2011 г. 19:06, спустя 25 минут 41 секунду
kostyl, ну питон, руби, перл, баш, сх, ксх, нодежс, вообще похуй ты чо как маленький то D:Сапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!