Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.05;
Скачать: CL | DM;

Вниз

Помогите с запросом с присоединением (MySQL)   Найти похожие ветки 

 
Dmitry S ©   (2008-07-31 18:50) [0]

Есть таблица
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 не имеет значения.
Что надо изменить в запросе?


 
Dmitry S ©   (2008-07-31 18:51) [1]

Опечатка, правильно так:
А надо, чтобы запрос вернул только две строки, к примеру:
1   1      somename1
2   3      somename3


 
Dmitry S ©   (2008-07-31 19:35) [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)

Оцените вариант. В таблице prop существует индекс по полю item_id


 
sniknik ©   (2008-07-31 20:01) [3]

SELECT i.id, p.id, p.name
FROM item AS i
INNER JOIN prop AS p ON i.id=ip.id


 
sniknik ©   (2008-07-31 20:02) [4]

опечатка
SELECT i.id, p.id, p.name
FROM item AS i
INNER JOIN prop AS p ON i.id=p.id


 
Правильный$Вася   (2008-07-31 20:08) [5]


> Необходимо выбрать записи из таблицы item и к каждой записи
> присоединить какую-нибудь (любую) одну запись из таблицы prop.

довольно странная задача
пояснишь?


 
Johnmen ©   (2008-07-31 21:02) [6]

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] в принципе неполучаем
:)


 
sniknik ©   (2008-07-31 21:28) [7]

> в принципе неполучаем
получаем, т.к. есть приписка
> Какую именно строку выберит MySQL из таблица prop не имеет значения.
вот это
> 3      somename3
из таблици prop.

т.что sniknik ©   (31.07.08 20:02) [4] вполне подойдет.
твое нет, т.к. у тебя данные могут быть из разных строк prop-а, а говорилось только про одну но любую.


 
Johnmen ©   (2008-07-31 21:35) [8]


> sniknik ©   (31.07.08 21:28) [7]
> > в принципе неполучаем
> получаем, т.к. есть приписка
> Какую именно строку выберит MySQL из таблица prop не имеет значения.
вот это
> 3      somename3
из таблици prop.

Но эта запись не присоединяется к 2запросом [4]

> т.что sniknik ©   (31.07.08 20:02) [4] вполне подойдет.твое
> нет, т.к. у тебя данные могут быть из разных строк prop-
> а, а говорилось только про одну но любую.

Да-да, про вообще любую недоглядел...:)))


 
Нат   (2008-08-01 00:57) [9]

Полная неопределенность выбора ... зачем тогда присоединять?
Надо как-то конкретизировать, по какому правилу выбирать...
Всегда первую или последнюю, или с масимальным значением, медиану или по случайному закону...
А совсем любую, это значит - на Ваше усмотрение, или советчика. Вот и выберите правило, наиболее удобное для Вас, если в задаче оно не указано.
Что будет для Вас "выбрать любую"?


 
Anatoly Podgoretsky ©   (2008-08-01 09:49) [10]

Не возможно, prop.id = 3 не существует.


 
Dmitry S ©   (2008-08-01 10:10) [11]

Моя ошибка - надо было сразу выдать реальную задачу.
Есть таблица, к примеру, новостей (item). У каждой новости могут быть фотографии (prop), сколько угодно.
Нужно выбрать список новостей, и к каждой новости выбрать одну (любую) из ее фотографий.


 
ЮЮ ©   (2008-08-01 10:16) [12]

> Нужно выбрать список новостей, и к каждой новости выбрать
> одну (любую) из ее фотографий.


Заменю (любую) в своем ТЗ на (первую, c наименьшим Id), (последнююю), ...
Сам сначала определись, прежде чем сервер терзать.


 
Dmitry S ©   (2008-08-01 10:36) [13]


> Заменю (любую) в своем ТЗ на (первую, c наименьшим Id),
> (последнююю), ...
> Сам сначала определись, прежде чем сервер терзать.
>

Зачем лишний раз нагружать сервер. Пусть выберет ту, которую ему удобнее (например, первую в таблице).


 
Sergey13 ©   (2008-08-01 10:59) [14]

> [13] Dmitry S ©   (01.08.08 10:36)
> например, первую в таблице

Это которую?

> которую ему удобнее
А если несколько одинаково удобно.
Он железяка тупая - он думать не может. И ошибаются те, кто думает, что он думает.


 
Dmitry S ©   (2008-08-01 11:22) [15]


> Он железяка тупая - он думать не может. И ошибаются те,
> кто думает, что он думает.

Однако понять, иносказательно выражаясь, на что потребуется меньше времени она может!


 
Sergey13 ©   (2008-08-01 11:37) [16]

> [15] Dmitry S ©   (01.08.08 11:22)
> Однако понять, иносказательно выражаясь, на что потребуется
> меньше времени она может!

Ты предлагаешь ей проанализировать ВСЕ варианты и выбрать оптимальный? Может проще самому сформулировать ЧЕТКОЕ условие, чем предлагать серверу смотреть на абстрактное удобство выборки?


 
ЮЮ ©   (2008-08-01 12:42) [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)


Разве такое возможно?


> Пусть выберет ту, которую ему удобнее (например, первую
> в таблице
).


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


 
Anatoly Podgoretsky ©   (2008-08-01 16:35) [18]

> Dmitry S  (01.08.2008 10:10:11)  [11]

Раз любую, то MAX или MIN и в случае подзапросов вариант ограничения выборки одной записью, в MySQL есть какое то средство для этого.



Страницы: 1 вся ветка

Текущий архив: 2009.04.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1233832544
Юрий
2009-02-05 14:15
2009.04.05
С днем рождения ! 5 февраля 2009 четверг


4-1207513836
Alex
2008-04-07 00:30
2009.04.05
Расстояние между иконками в Virtual ListView.


3-1218479109
Евгений Р.
2008-08-11 22:25
2009.04.05
Изменение формулы вычисляемого поля


15-1233817925
Slider007
2009-02-05 10:12
2009.04.05
С днем рождения ! 2 февраля 2009 понедельник


2-1234972130
Strate
2009-02-18 18:48
2009.04.05
Глобальный Mutex и FileMapping Object