Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с запросом с присоединением (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


Наверх

Титульная страница Поиск, карта сайта Написать письмо