| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Объединение двух запросов |
| Автор: Isaev 12.11.2013, 12:16 | ||||
| Доброго времени суток Делаю выборку из 1 таблицы:
потом обхожу её в цикле и выбираю для каждой записи следующие данные(тут zid это id из первой выборки):
Как эти 2 зарпоса объединить в один? Заранее благодарен |
| Автор: Zloxa 12.11.2013, 12:33 |
заменить на pid=mid |
| Автор: Isaev 12.11.2013, 12:38 |
| Zloxa, нет, всё работает, просто я хочу 1 запросом вытаскивать все нужные данные, чтобы не нагружать лишний раз сервер, да и не громоздить в коде (просто если первый запрос возвернёт 5000 записей, потом делаю 5000 вторых запросов, что не желательно бы) т.е. надо получить сразу id, pid, title, sorting, headline, text в ответе и немного не так вы поняли проблемму... mid это переменная, не имеющая отношения к таблице, можете взять любую константу, например 1 zid(во избежании путаницы, т.к. во втором запросе тоже есть id) это тоже переменная, которая равна id из первого запроса на каждом этапе обхода его курсором например |
| Автор: Isaev 12.11.2013, 12:53 |
| Zloxa, а точно, работает! не думал что так просто, спасибо большое! |
| Автор: Zloxa 12.11.2013, 12:53 | ||
Пропишите их в селектлисте. Это вы не правильно поняли, что я вам предложил. Подумайте еще раз.
|
| Автор: Isaev 12.11.2013, 13:19 |
| Zloxa, есть только один не приятный момент) если при "втором" запросе ничего не находится для данного id, то то, что было в первом должно бы оставаться, просто с пустыми полями headline, text а в данном случае оно, естественно отсеивается это возможно поправить? думаю там что-то типа JOIN надо использовать |
| Автор: baldina 12.11.2013, 13:40 | ||
|
| Автор: Akina 12.11.2013, 13:41 |
| Не типа, а именно JOIN. Причём LEFT JOIN. Причём явно указать порядок связывания таблиц - во избежание. |
| Автор: Isaev 12.11.2013, 14:35 |
| не выходит что-то... извиняюсь конечно, что туплю... всё конечно просто, когда штудировал sql щёлкал тоже как орешки, но давно это было Порядок да, не указал я выше нигде... порядок следующий: `tl_page`основная таблица, откуда берем (id, pid, title, sorting) для результирующей `tl_article`просто для связи `tl_page` и `tl_content`, там только id и pid `tl_content` отсюда берём headline, text, если есть соответствие, иначе оставляем эти поля пустыми |
| Автор: Zloxa 12.11.2013, 14:42 |
Вы тщательнее, тщательнее тужтесь. http://segfault.kiev.ua/smart-questions-ru.html#grovelling |
| Автор: Zloxa 12.11.2013, 14:55 |
Если пилить подобие цикла из топикстарта, то page left join (article inner join context) Но мне кажется усложнение тут излишним. Для начало следовало бы исследовать неприемлимость тупого лефджойна всего прочего к пейджу. Скорее всего он допустим. Разница всплывет лишь в случае неуникальности неконсистентной связи в артиклях. |
| Автор: Isaev 12.11.2013, 15:03 | ||
не, не да и для моей задачи и мой вариант годится, там выбока не большая... Просто врождённая слабость к оптимизациям)
её скорее всего тоже нету т.е. вложенного SELECT тут не будет? почему-то я к нему прихожу постоянно |
| Автор: Zloxa 12.11.2013, 15:09 |
Если в артикле не содержится "подвисших" записей, то вложенный селект не нужен. Если в артикле пара id,pid ункальна, вложенный селект не нужен. Если я правильно понял структуру даннных и данные в этой структуре целостны, то оба вышеперечисленных условия должны выполняться. Таки даже в случае униакльности несогласованных данынх, выборка может замножить записи, потому условия сократил. Добавлено @ 15:19 Именно что убили. Вы не показали ничего, к чему пришли в течении часа. Вы не рассказали что именно у вас не получается и не показали какой дорогой пошли. Это наводит на мысли что вы бы предпочли чтобы вас не направляли в нужную сторону, а тупо сделали бы за вас вашу работу. А это объясняет - почему у вас отсутствует желание разбиратсья с элементарнейшими основами. Если вас не заботит результат, от чего он должен заботить кого-то другого? |
| Автор: Isaev 12.11.2013, 15:32 | ||
пока возвращает слишком много лишнего |
| Автор: Akina 12.11.2013, 15:47 |
| Isaev, внимательно... Нет, не так. ВНИМАТЕЛЬНО перечитайте ещё раз всю тему. Чем ближе к концу, тем внимательнее. |
| Автор: Zloxa 12.11.2013, 16:12 | ||||
Короче, тему пора закрывать:
либо, если в артикле есть "битые" ссылки на контент, чтобы получить аналог с топикстартом:
Для второго, случая, думаю, мася врядли сможет применить латерал субквери и пропушить джойн предикат из внешнего подзапроса, потому, если за согласованностью данных не следят, скорее всего это получится анти оптимизация. |
| Автор: Akina 12.11.2013, 16:23 | ||
Тогда уж лучше добавить доп. условие в первый вариант и отсечь зависший контент
|
| Автор: Zloxa 12.11.2013, 16:23 | ||
пожалуй, можно еще отфильтровать их добавив в where первого запроса. Наверное как-то так:
|
| Автор: Akina 12.11.2013, 16:24 |
| Zloxa, |
| Автор: Zloxa 12.11.2013, 17:27 | ||
| Akina, где-то мы с тобой расходимся, кто-то из нас накосячил. По закону де моргана у нас с тобой должны бы быть инверсными предикаты. Я вот даже табличку истинности набросал, но чот не могу сообразить кто же накосячив. Моя предвзятость меня склоняет к мнению, что я скорее более прав, но что-то не позволяет склониться к этому мнению уверенно.
Мне кажется ты отфильтровываешь тот кейс, который невер бин хаппенд. и это. Здесь лучше пид. Если id nullable, а произошел джойн по пиду... |
| Автор: Akina 12.11.2013, 18:45 | ||
Это опечатка :(
Я фильтрую подвисший текст. Т.е. контент есть, а статьи к нему нет. КАжется... |
| Автор: Zloxa 12.11.2013, 21:47 |
C учетом того, что контент тут подтягивается через артикль, это не существующий кейс )) |
| Автор: Isaev 13.11.2013, 10:33 |
| Zloxa, взял второй вариант на всякий случай, хотя первый справляется так же, видимо кривых данных нет (ну пока по крайней мере), но т.к. за них отвечаю не я, лучше подстраховаться Спасибо, ребята! Большое и человеческое |