SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.08.2012 19:38:50

sito-corito
Завсегдатай
Зарегистрирован: 13.07.2008
Сообщений: 53

Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

Есть две таблицы.
Первая называется 'articel'. В ней находятся статьи. Уникальный ключ в этой таблице 'id'.
Вторая называется 'meta'. Во второй таблице находится дополнительная информация о статьях из первой таблицы. Здесь содержатся ячейки 'meta_id', 'meta_pole', 'meta_value', 'id'. Для каждой статьи из первой таблицы найдётся сколько угодно строк во второй таблице.
Как одним запросом можно отсортировать по возрастанию поля 'meta_value' данные из второй таблицы, взять из них первые 10 результатов, определить их 'id', а потом из первой таблицы извлечь все статьи, чей id был обнаружен чуть ранее в первом подзапросе.

Возможно, такой запрос следует разбить на два запроса, или реально его выполнить за раз?

Отредактированно sito-corito (06.08.2012 19:42:03)

Неактивен

 

#2 06.08.2012 20:36:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

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;

Неактивен

 

#3 08.08.2012 20:10:20

sito-corito
Завсегдатай
Зарегистрирован: 13.07.2008
Сообщений: 53

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

vasya написал:

select .. from article a join (select id from meta order by meta_value limit 10) b on a.id=b.id;

Спасибо. Похоже это то что надо.

Неактивен

 

#4 09.08.2012 16:56:15

sito-corito
Завсегдатай
Зарегистрирован: 13.07.2008
Сообщений: 53

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

Я бы хотел уточнить кое-какие условия запроса, выяснилось, что сейчас запрос выше не подходит. Привожу более подробное описание задачи.
В таблице '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)

Неактивен

 

#5 10.08.2012 00:23:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

select id from meta where meta_pole in (2,5) group by id having count(*)>=2 order by meta_value limit 1;

Неактивен

 

#6 11.08.2012 09:36:18

sito-corito
Завсегдатай
Зарегистрирован: 13.07.2008
Сообщений: 53

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

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, но это не помогает

Неактивен

 

#7 11.08.2012 11:39:01

sito-corito
Завсегдатай
Зарегистрирован: 13.07.2008
Сообщений: 53

Re: Выбрать из первой таблицы все строки, на которые ссылаются данные из второй

Всем спасибо, уже разобрался. У меня была ошибка в запросе. Сейчас уже исправил.
Проблема решается с помощью использования псевдонимов.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson