ФорумПрограммированиеPHP для идиотов → JOIN в SQL запросах

JOIN в SQL запросах

  • gooddaytoday

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 11 марта 2011 г. 6:32

    Недопру никак уже 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

    Возвращает гадкие результаты. Т.к. кол-во предметов в товарных таблицах разное, там где их меньше, они дублируются.
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 11 марта 2011 г. 6: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
  • gooddaytoday

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 11 марта 2011 г. 9: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


    возвращает тот же самый результат. Очевидно, придется делать логику с помощью вспомогательных таблиц….
  • gooddaytoday

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 11 марта 2011 г. 12:59, спустя 3 часа 26 минут 28 секунд

    Да этож ад полный.

    посмотрел Внимательно, что придется сделать - так вышло, что всю архитектуру опять заново менять придется. А кажется что уже крикнули с мачты долгожданное "Земля!!!!!!!" а тут такой медный таз пришел моим надеждам.
  • gooddaytoday

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 12 марта 2011 г. 2:40, спустя 13 часов 40 минут 55 секунд

    Понял как надо. Уже почти алиллуя.

    Запрос:

    (SELECT t1.id,c1.ctr ….)
    UNION
    (SELECT t2.id,c2.ctr ….)
    UNION
    ……..
    ORDER BY ctr;

    Только теперь другая проблема. Мне необходимо возвращать для каждой строки имя таблицы. Просто писать в селект? Не кактит, ибо кол-во таблиц для выборки разное всегда.
  • gooddaytoday

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 12 марта 2011 г. 2: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;
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 2: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
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 2:41, спустя 9 минут 41 секунду

    сейчас намечается тенденция отказа от джоинов…
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 2:46, спустя 4 минуты 48 секунд

    Ну я тоже не думаю что разница между джойнами и отдельными запросами настолько велика. Просто как-то всё советуют всё в одном запросе по возможности извлекать. Вот и решил попробовать. Теперь хочу понять что не так делаю.
    from TRIAL with LOVE
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 19 мая 2011 г. 4:29, спустя 1 час 42 минуты 39 секунд

    результирующее поле(я) должно быть одно при использовании UNION
    у тебя:
    AS `user`
    AS `online`
    AS `video`

    Спустя 229 сек.
    суть UNION'a - несколько селектов, различающихся условиями WHERE и имеющих одинаковый результирующий набор полей
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 4:56, спустя 27 минут 27 секунд

    вообще я с джоинами обычно экспериментирую… ибо в зависимости от архитектуры БД, схемы, количества данных и требуемых данных могут подходить совершенно разные варианты… нет чёткого правила… когда то применили 5 запросов вместо одного и получили выигрышь очень неплохой…
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 5:45, спустя 48 минут 59 секунд

    Faster, ок буду знать. попробую везде поставить AS `result` например
    from TRIAL with LOVE
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 19 мая 2011 г. 7:16, спустя 1 час 30 минут 59 секунд

    жойны гавно, бд гавно, рулит тру мемори акесс и ява, все остальный сосут хуй и тп xD
    Сапожник без сапог
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 19 мая 2011 г. 7:40, спустя 23 минуты 52 секунды

    phpdude, чё это ява?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 19 мая 2011 г. 8:06, спустя 25 минут 41 секунду

    kostyl, ну питон, руби, перл, баш, сх, ксх, нодежс, вообще похуй ты чо как маленький то D:
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!