[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: LIMIT у внутреннего SELECT
Romms
И так есть приблизительно такой запрос:
SELECT *
FROM articles, tags, connection
WHERE articles.id IN (SELECT id_article FROM connection WHERE id_tag=17)
ORDER BY articles.id

Когда вставляю ЛИМИТ в SELECT id_article FROM connection WHERE id_tag=17 то MySQL говорит:
Цитата
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery


У меня версия Мускула - 5.0.45
Брат говорит что такой запрос должен исполняться(он больше всего работает с Oracle)

Так может мне базу обновить? Или хотябы в Постгре работать будет? Или может есть идеи как записать этот запрос по иному?



Спустя 3 часа, 42 минуты, 34 секунды (18.04.2010 - 11:26) vagrand написал(а):
ИМХО нужно разбить запрос на два:
1. SELECT id_article FROM connection WHERE id_tag=17
2. SELECT *
FROM articles, tags, connection
WHERE articles.id IN ($articles_ids)
ORDER BY articles.id

Спустя 8 часов, 56 минут, 52 секунды (18.04.2010 - 20:23) Romms написал(а):
vagrand, в том и проблема, что это не очень хорошей выход...

Спустя 14 часов, 3 минуты, 32 секунды (19.04.2010 - 10:27) vagrand написал(а):
Romms

Ну да, а делать подзапрос просто абалденный выход?
Ты хоть знаешь что подзапросы выполняются для каждой отобранной в запросе строки?

Спустя 8 минут, 18 секунд (19.04.2010 - 10:35) sergeiss написал(а):
Цитата (Romms @ 18.04.2010 - 08:44)
Брат говорит что....

Брат может говорить всё, что угодно, но у каждой БД есть своя специфика. Связанная с тем, что есть отклонения от стандарта (точнее будет их назвать "дополнениями").

Цитата (Romms @ 18.04.2010 - 08:44)

Или хотя бы в Постгре работать будет?

В Постгре такой запрос был бы записан так:

with 
id_list as (SELECT id_article FROM connection WHERE id_tag=17 limit 5)

SELECT *
FROM articles, tags, connection
WHERE articles.id IN id_list
ORDER BY articles.id

То есть, сначала (гарантированно только 1 раз!!!) был бы сделан "подзапрос", а потом он был бы использован в основном запросе. Обращаю внимание, что это - один "сложный" запрос, а не два разных.
Сия фича очень полезна smile.gif, использую ее по мере необходимости.

Спустя 33 минуты, 57 секунд (19.04.2010 - 11:09) vagrand написал(а):
sergeiss

Жаль что речь у автора идет не о посгресе

Спустя 51 минута, 51 секунда (19.04.2010 - 12:01) sergeiss написал(а):
Цитата (vagrand @ 19.04.2010 - 12:09)
Жаль что речь у автора идет не о посгресе


Но если прочитать ВНИМАТЕЛЬНО, то увидим такой вопрос (который я цитировал в своем ответе):
Цитата (Romms @ 18.04.2010 - 08:44)
Или хотя бы в Постгре работать будет?



Спустя 1 час, 5 минут, 57 секунд (19.04.2010 - 13:07) glock18 написал(а):
vagrand
здесь запрос отработает один раз. одним таким запросом будет немного быстрее, чем двумя.

Romms
запрос содержит одну-две таблицы, которые не используются

SELECT *
FROM articles, tags, connection
WHERE articles.id IN (SELECT id_article FROM connection WHERE id_tag=17)
ORDER BY articles.id


я о tags и connection (connection неявно все таки джойнится во вложенном запросе).

все делается без подзапроса (join тем не менее нужен, разумеется). что-то типа этого:

select *
from articles a
inner join connection c on a.id = c.id_article
where c.id_tag = 17
order by a.id
limit 10

Спустя 18 часов, 54 минуты, 49 секунд (20.04.2010 - 08:02) Romms написал(а):
Цитата (glock18 @ 19.04.2010 - 12:07)
запрос содержит одну-две таблицы, которые не используются


Сори, обрезал лишние, а про таблицы выбора забыл smile.gif
Цитата

все делается без подзапроса (join тем не менее нужен, разумеется). что-то типа этого:
select *
from articles a
inner join connection c on a.id = c.id_article
where c.id_tag = 17
order by a.id
limit 10

Да, оно то так, но мне надо выбрать не только статьи, но и темы к этим сатьям unsure.gif

Спустя 17 минут, 17 секунд (20.04.2010 - 08:19) glock18 написал(а):
Romms
в чем дело то, джойнь таблицу. более чем уверен, что отношение 1 к 1 у них.

Спустя 22 часа, 29 минут, 44 секунды (21.04.2010 - 06:49) Romms написал(а):
чтобы незабывать лишним голову пользователям, я спростил запрос.. unsure.gif
На самом деле он такой:
SELECT `tags`.`id` AS `tags.id`,
`tags`.`name` AS `tags.name`,
`articles`.`id` AS `articles.id`,
`articles`.`name` AS `articles.name`,
`articles`.`short`,
`articles`.`date`,
`articles`.`ip`
FROM articles, tags, connection
WHERE articles.id IN (SELECT id_article FROM connection WHERE id_tag=17)
and articles.id = connection.id_article
and tags.id = connection.id_tag
ORDER BY articles.id

Спустя 50 минут, 25 секунд (21.04.2010 - 07:39) glock18 написал(а):
select *
from articles a
inner join connection c on a.id = c.id_article
inner join tags t on t.id = c.id_tag
where c.id_tag = 17
order by a.id
limit 10
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.