![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с запросом с присоединением (MySQL) [MySQL]
Dmitry S © (2008-07-31 18:50:00)Есть таблица
item с полями (id, code),
если таблица
prop с полями (id, item_id, name, value),
Каждой записи в таблице item соответствует множество записей в таблице prop.
Необходимо выбрать записи из таблицы item и к каждой записи присоединить какую-нибудь (любую) одну запись из таблицы prop.
К примеру таблица item:
id code
1 'somecode1'
2 'somecode2'
Таблица prop
id item_id name value
1 1 'somename1' 'somevalue'
2 1 'somename2' 'somevalue'
3 1 'somename3' 'somevalue'
4 2 'somename4' 'somevalue'
5 2 'somename5' 'somevalue'
И запрос:
SELECT item.id, prop.id, prop.name FROM item LEFT JOIN prop ON prop.item_id=item.id WHERE item.id IN (1,2)
Запрос возвращает пять строк:
1 1 somename1
1 2 somename2
1 3 somename3
2 4 somename4
2 5 somename5
А надо, чтобы запрос вернул только две строки, к примеру:
1 1 somename1
1 3 somename3
Какую именно строку выберит MySQL из таблица prop не имеет значения.
Что надо изменить в запросе?
Anatoly Podgoretsky (2008-08-01 16:35:00) [1]> Dmitry S (01.08.2008 10:10:11) [11]
Раз любую, то MAX или MIN и в случае подзапросов вариант ограничения выборки одной записью, в MySQL есть какое то средство для этого.
ЮЮ (2008-08-01 12:42:00) [2]> Пока сделал так:
>
>
> SELECT item.id, p.id, p.name
> FROM item
> LEFT JOIN (SELECT *FROM prop GROUP BY `item_id`) AS p
> ON p.item_id=item.id
> WHERE item.id IN (1,2)
Разве такое возможно?
> Пусть выберет ту, которую ему удобнее ( например, первую
> в таблице).
SELECT item.id, p.id, p.name
FROM item
LEFT JOIN (SELECT item_id, MIN(Id) fistId FROM prop GROUP BY `item_id`) AS first_p ON first_p.item_id=item.id
LEFT JOIN prop p ON p.Id=first_p.fistId
Sergey13 (2008-08-01 11:37:00) [3]> [15] Dmitry S © (01.08.08 11:22)
> Однако понять, иносказательно выражаясь, на что потребуется
> меньше времени она может!
Ты предлагаешь ей проанализировать ВСЕ варианты и выбрать оптимальный? Может проще самому сформулировать ЧЕТКОЕ условие, чем предлагать серверу смотреть на абстрактное удобство выборки?
Dmitry S (2008-08-01 11:22:00) [4]
> Он железяка тупая - он думать не может. И ошибаются те,
> кто думает, что он думает.
Однако понять, иносказательно выражаясь, на что потребуется меньше времени она может!
Sergey13 (2008-08-01 10:59:00) [5]> [13] Dmitry S © (01.08.08 10:36)
> например, первую в таблице
Это которую?
> которую ему удобнее
А если несколько одинаково удобно.
Он железяка тупая - он думать не может. И ошибаются те, кто думает, что он думает.
Dmitry S (2008-08-01 10:36:00) [6]
> Заменю (любую) в своем ТЗ на (первую, c наименьшим Id),
> (последнююю), ...
> Сам сначала определись, прежде чем сервер терзать.
>
Зачем лишний раз нагружать сервер. Пусть выберет ту, которую ему удобнее (например, первую в таблице).
ЮЮ (2008-08-01 10:16:00) [7]> Нужно выбрать список новостей, и к каждой новости выбрать
> одну (любую) из ее фотографий.
Заменю (любую) в своем ТЗ на (первую, c наименьшим Id), (последнююю), ...
Сам сначала определись, прежде чем сервер терзать.
Dmitry S (2008-08-01 10:10:00) [8]Моя ошибка - надо было сразу выдать реальную задачу.
Есть таблица, к примеру, новостей (item). У каждой новости могут быть фотографии (prop), сколько угодно.
Нужно выбрать список новостей, и к каждой новости выбрать одну (любую) из еефотографий.
Anatoly Podgoretsky (2008-08-01 09:49:00) [9]Не возможно, prop.id = 3 не существует.
Нат (2008-08-01 00:57:00) [10]Полная неопределенность выбора ... зачем тогда присоединять?
Надо как-то конкретизировать, по какому правилу выбирать...
Всегда первую или последнюю, или с масимальным значением, медиану или по случайному закону...
А совсем любую, это значит - на Ваше усмотрение, или советчика. Вот и выберите правило, наиболее удобное для Вас, если в задаче оно не указано.
Что будет для Вас "выбрать любую"?
Johnmen (2008-07-31 21:35:00) [11]
> sniknik © (31.07.08 21:28) [7]
> > в принципе неполучаем
> получаем, т.к. есть приписка
> Какую именно строку выберит MySQL из таблица prop не имеет значения.
вот это
> 3 somename3
из таблици prop.
Но эта запись не присоединяется к 2запросом [4]
> т.что sniknik © (31.07.08 20:02) [4] вполне подойдет.твое
> нет, т.к. у тебя данные могут быть из разных строк prop-
> а, а говорилось только про одну но любую.
Да-да, про вообще любую недоглядел...:)))
sniknik (2008-07-31 21:28:00) [12]> в принципе неполучаем
получаем, т.к. есть приписка
> Какую именно строку выберит MySQL из таблица prop не имеет значения.
вот это
> 3 somename3
из таблици prop.
т.что sniknik © (31.07.08 20:02) [4] вполне подойдет.
твое нет, т.к. у тебя данные могут быть из разных строк prop-а, а говорилось только про одну но любую.
Johnmen (2008-07-31 21:02:00) [13]
SELECT i.id, MIN(p.id), MAX(p.name)
FROM item AS i
INNER JOIN prop AS p ON i.id=p.item_id
GROUP BY i.id
PS
из исходных данных [0] результат [1] в принципе неполучаем
:)
Правильный$Вася (2008-07-31 20:08:00) [14]
> Необходимо выбрать записи из таблицы item и к каждой записи
> присоединить какую-нибудь (любую) одну запись из таблицы prop.
довольно странная задача
пояснишь?
sniknik (2008-07-31 20:02:00) [15]опечатка
SELECT i.id, p.id, p.name
FROM item AS i
INNER JOIN prop AS p ON i.id=p.id
sniknik (2008-07-31 20:01:00) [16]
SELECT i.id, p.id, p.name
FROM item AS i
INNER JOIN prop AS p ON i.id=ip.id
Dmitry S (2008-07-31 19:35:00) [17]Пока сделал так:
SELECT item.id, p.id, p.name
FROM item
LEFT JOIN (SELECT * FROM prop GROUP BY `item_id`) AS p
ON p.item_id=item.id
WHERE item.id IN (1,2)
Оцените вариант. В таблице prop существует индекс по полю item_id
Dmitry S (2008-07-31 18:51:00) [18]Опечатка, правильно так:
А надо, чтобы запрос вернул только две строки, к примеру:
1 1 somename1
2 3 somename3