Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть две таблицы.
Первая называется 'articel'. В ней находятся статьи. Уникальный ключ в этой таблице 'id'.
Вторая называется 'meta'. Во второй таблице находится дополнительная информация о статьях из первой таблицы. Здесь содержатся ячейки 'meta_id', 'meta_pole', 'meta_value', 'id'. Для каждой статьи из первой таблицы найдётся сколько угодно строк во второй таблице.
Как одним запросом можно отсортировать по возрастанию поля 'meta_value' данные из второй таблицы, взять из них первые 10 результатов, определить их 'id', а потом из первой таблицы извлечь все статьи, чей id был обнаружен чуть ранее в первом подзапросе.
Возможно, такой запрос следует разбить на два запроса, или реально его выполнить за раз?
Отредактированно sito-corito (06.08.2012 19:42:03)
Неактивен
select .. from article where id in (select id from meta order by meta_value limit 10);
В MySQL такой запрос будет работать скорее всего долго, поэтому лучше переписать его через join.
select .. from article a join (select id from meta order by meta_value limit 10) b on a.id=b.id;
Неактивен
vasya написал:
select .. from article a join (select id from meta order by meta_value limit 10) b on a.id=b.id;
Спасибо. Похоже это то что надо.
Неактивен
Я бы хотел уточнить кое-какие условия запроса, выяснилось, что сейчас запрос выше не подходит. Привожу более подробное описание задачи.
В таблице 'meta' может существовать несколько полей с одинаковыми 'id', но отличающиеся всеми остальными полями: 'meta_pole' и 'meta_value' и 'meta_id (уникальный ключ).
'meta_id' | 'meta_pole' | 'meta_value' | 'id'
1 | 2 | stroka1 | 10
2 | 10 | stroka2 | 12
3 | 5 | stroka3 | 10
4 | 2 | stroka4 | 12
Вложенный запрос вида:
select id from meta order by meta_value limit 10
не подходит, так как из таблицы 'meta' нужно извлечь те id, у которых 'meta_pole' имеет и значение '2' и значение '5' одновременно (к примеру возьмём эти значения). Подчеркиваю, что выбор нужного 'id' в таблице 'meta' осуществляется на анализе одновременно двух строк, а не одной, как это обычно бывает. Такова архитектура БД и я её изменить не могу. В примере выше видно, что такому условию удовлетворяет только статья с идентификатором '10', Другая статья с идентификатором '12' хотя и присутствует в таблице 'meta', но она не нужна, потому что у неё поля 'meta_pole' имеют не нужные нам значения.
К тому же, после того, как будут получены нужные идентификаторы статей, нужно будет их отсортировать по полю 'meta_value', в одной строке с которым значение 'meta_pole' равно определённому значению (в примере это значение '2'). Как мне кажется, это достигается включением в результат только одной строки из двух нужных нам (в данном случае той, что имеет 'meta_pole' равным '2'), что позволит только её и учитывать для сортировки.
Каким зарос должен быть в этом случае?
Отредактированно sito-corito (09.08.2012 17:04:05)
Неактивен
Неактивен
vasya написал:
select id from meta where meta_pole in (2,5) group by id having count(*)>=2 order by meta_value limit 1;
Разобрался, что задача решается по другому. Для этого надо одну и ту же таблицу 'meta' объединить с самой собой. В результирующей таблице необходимо отобрать те строки, которые удовлетворяют нужным условиям. Примерно запрос должен выглядеть так:
SELECT a.id, a.meta_pole, a.meta_value
FROM `meta` as a join `meta` as b on a.id=b.id where a.meta_pole=2 AND b.meta_pole=6
ORDER by a.meta_value ASC
Не знаю, насколько он производителен, но для меня он делает то что надо.
Помогите теперь дальше составить запрос. Так как я получил нужные результаты и узнал нужные мне id статей, то теперь мне нужно полученные результаты объединить с таблице со статьями. Я делаю примерно так:
SELECT * FROM article AS c JOIN (... здесь я вставляю мой запрос, написанный выше) AS d ON c.id=... (а вот здесь я не знаю, что написать). Помогите, потому что не знаю, как записать условие объединения. Пишу всяко: c.id=d.id и c.id=a.id, но это не помогает
Неактивен
Всем спасибо, уже разобрался. У меня была ошибка в запросе. Сейчас уже исправил.
Проблема решается с помощью использования псевдонимов.
Неактивен
Страниц: 1