Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение двух запросов, sql 
:(
    Опции темы
Isaev
Дата 12.11.2013, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Доброго времени суток

Делаю выборку из 1 таблицы:
Код

SELECT id, pid, title, sorting FROM `tl_page` WHERE pid=mid ORDER BY sorting

потом обхожу её в цикле и выбираю для каждой записи следующие данные(тут zid это id из первой выборки):
Код

SELECT headline, text FROM `tl_content`, `tl_article`, `tl_page` WHERE (tl_page.id=tl_article.pid AND tl_article.id=tl_content.pid AND tl_page.id=zid)


Как эти 2 зарпоса объединить в один?

Заранее благодарен
PM MAIL ICQ   Вверх
Zloxa
Дата 12.11.2013, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Isaev @  12.11.2013,  13:16 Найти цитируемый пост)
tl_page.id=zid

заменить на pid=mid 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Isaev
Дата 12.11.2013, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Zloxa, нет, всё работает, просто я хочу 1 запросом вытаскивать все нужные данные, чтобы не нагружать лишний раз сервер, да и не громоздить в коде (просто если первый запрос возвернёт 5000 записей, потом делаю 5000 вторых запросов, что не желательно бы)
т.е. надо получить сразу id, pid, title, sorting, headline, text в ответе

и немного не так вы поняли проблемму... mid это переменная, не имеющая отношения к таблице, можете взять любую константу, например 1
zid(во избежании путаницы, т.к. во втором запросе тоже есть id) это тоже переменная, которая равна id из первого запроса на каждом этапе обхода его курсором например

Это сообщение отредактировал(а) Isaev - 12.11.2013, 12:43
PM MAIL ICQ   Вверх
Isaev
  Дата 12.11.2013, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Zloxa, а точно, работает! не думал что так просто, спасибо большое!

Это сообщение отредактировал(а) Isaev - 12.11.2013, 12:54
PM MAIL ICQ   Вверх
Zloxa
Дата 12.11.2013, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Isaev @  12.11.2013,  13:38 Найти цитируемый пост)
 получить сразу id, pid, title, sorting, headline, text в ответе

Пропишите их в селектлисте.

Цитата(Isaev @  12.11.2013,  13:38 Найти цитируемый пост)
немного не так вы поняли проблемму..

Это вы не правильно поняли, что я вам предложил.
Подумайте еще раз.

Код

SELECT headline, text 
  ,tl_page.id, tl_page.pid, tl_page.title, tl_page.sorting
FROM `tl_content`, `tl_article`, `tl_page` WHERE (tl_page.id=tl_article.pid AND tl_article.id=tl_content.pid AND tl_page.pid=mid
order by tl_page.sorting



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Isaev
Дата 12.11.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Zloxa,  есть только один не приятный момент)
если при "втором" запросе ничего не находится для данного id, то то, что было в первом должно бы оставаться, просто с пустыми полями headline, text
а в данном случае оно, естественно отсеивается
это возможно поправить? думаю там что-то типа JOIN надо использовать

Это сообщение отредактировал(а) Isaev - 12.11.2013, 13:22
PM MAIL ICQ   Вверх
baldina
Дата 12.11.2013, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Код

LEFT JOIN tl_article ON tl_page.id=tl_article.pid

PM MAIL   Вверх
Akina
Дата 12.11.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Не типа, а именно JOIN. Причём LEFT JOIN. Причём явно указать порядок связывания таблиц - во избежание.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Isaev
Дата 12.11.2013, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



не выходит что-то... извиняюсь конечно, что туплю... всё конечно просто, когда штудировал sql щёлкал тоже как орешки, но давно это было
Цитата(Akina @  12.11.2013,  13:41 Найти цитируемый пост)
Причём явно указать порядок связывания таблиц

Порядок да, не указал я выше нигде... порядок следующий:
`tl_page`основная таблица, откуда берем (id, pid, title, sorting) для результирующей
`tl_article`просто для связи `tl_page` и `tl_content`, там только id и pid
`tl_content` отсюда берём headline, text, если есть соответствие, иначе оставляем эти поля пустыми
PM MAIL ICQ   Вверх
Zloxa
Дата 12.11.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Isaev @  12.11.2013,  15:35 Найти цитируемый пост)
не выходит что-то

Вы тщательнее, тщательнее тужтесь. smile

http://segfault.kiev.ua/smart-questions-ru.html#grovelling

Это сообщение отредактировал(а) Zloxa - 12.11.2013, 14:43


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 12.11.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Isaev @  12.11.2013,  15:35 Найти цитируемый пост)
Порядок да, не указал я выше нигде... порядок следующий:
`tl_page`основная таблица, откуда берем (id, pid, title, sorting) для результирующей
`tl_article`просто для связи `tl_page` и `tl_content`, там только id и pid
`tl_content` отсюда берём headline, text, если есть соответствие, иначе оставляем эти поля пустыми 

Значит, или 
(tl_page INNER JOIN tl_article) LEFT JOIN tl_content
или
(tl_article INNER JOIN tl_page) LEFT JOIN tl_content
А если оптимизатор настолько "умный", что сперва раскроет скобки, а потом про них забудет - то вообще придётся первое связывание выполнять в подзапросе. UPD: фигня, у нас одно левое связывание.

Это сообщение отредактировал(а) Akina - 12.11.2013, 14:50


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 12.11.2013, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  12.11.2013,  15:45 Найти цитируемый пост)
или 

Цитата(Akina @  12.11.2013,  15:45 Найти цитируемый пост)
или

Если пилить подобие цикла из топикстарта, то page left join (article inner join context)
Но мне кажется усложнение тут излишним. Для начало следовало бы исследовать неприемлимость тупого лефджойна всего прочего к пейджу. Скорее всего он допустим. Разница всплывет лишь в случае неуникальности неконсистентной связи в артиклях.

Это сообщение отредактировал(а) Zloxa - 12.11.2013, 14:58


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Isaev
Дата 12.11.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(Zloxa @  12.11.2013,  14:42 Найти цитируемый пост)
http://segfault.kiev.ua/smart-questions-ru.html#grovelling

не, не smile я честно убил очередной час
да и для моей задачи и мой вариант годится, там выбока не большая... Просто врождённая слабость к оптимизациям)

Цитата(Zloxa @  12.11.2013,  14:55 Найти цитируемый пост)
Разница всплывет лишь в случае неуникальности неконсистентной связи в артиклях.

её скорее всего тоже нету

т.е. вложенного SELECT тут не будет? почему-то я к нему прихожу постоянно

Это сообщение отредактировал(а) Isaev - 12.11.2013, 15:07
PM MAIL ICQ   Вверх
Zloxa
Дата 12.11.2013, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Isaev @  12.11.2013,  16:03 Найти цитируемый пост)
т.е. вложенного SELECT тут не будет?

Если в артикле не содержится "подвисших" записей, то вложенный селект не нужен.

Если в артикле пара id,pid ункальна, вложенный селект не нужен.

Если я правильно понял структуру даннных и данные в этой структуре целостны, то оба вышеперечисленных условия должны выполняться. 

Таки даже в случае униакльности несогласованных данынх, выборка может замножить записи, потому условия сократил.

Добавлено @ 15:19
Цитата(Isaev @  12.11.2013,  16:03 Найти цитируемый пост)
не, не  я честно убил очередной час

Именно что убили. Вы не показали ничего, к чему пришли в течении часа. Вы не рассказали что именно у вас не получается и не показали какой дорогой пошли. Это наводит на мысли что вы бы предпочли чтобы вас не направляли в нужную сторону, а тупо сделали бы за вас вашу работу.
Цитата(Isaev @  12.11.2013,  16:03 Найти цитируемый пост)
да и для моей задачи и мой вариант годится

А это объясняет - почему у вас отсутствует желание разбиратсья с элементарнейшими основами. smile 
Если вас не заботит результат, от чего он должен заботить кого-то другого? smile

Это сообщение отредактировал(а) Zloxa - 12.11.2013, 15:31


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Isaev
Дата 12.11.2013, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(Zloxa @  12.11.2013,  15:09 Найти цитируемый пост)
Вы не показали ничего, к чему пришли в течении часа. 


Код

SELECT tl_page.id, tl_page.pid, tl_page.title, headline, text FROM tl_page INNER JOIN (tl_article LEFT JOIN tl_content ON tl_article.id=tl_content.pid) ON tl_page.id=tl_article.pid


пока возвращает слишком много лишнего

Это сообщение отредактировал(а) Isaev - 12.11.2013, 15:33
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1086 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.