Конференция "Базы" » Помогите с запросом с присоединением (MySQL) [MySQL]
 
  • Dmitry S © (31.07.08 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 © (31.07.08 18:51) [1]
    Опечатка, правильно так:
    А надо, чтобы запрос вернул только две строки, к примеру:
    1   1      somename1
    2   3      somename3
  • Dmitry S © (31.07.08 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 © (31.07.08 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 © (31.07.08 20:02) [4]
    опечатка
    SELECT i.id, p.id, p.name
    FROM item AS i
    INNER JOIN prop AS p ON i.id=p.id

  • Правильный$Вася (31.07.08 20:08) [5]

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

    довольно странная задача
    пояснишь?
  • Johnmen © (31.07.08 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 © (31.07.08 21:28) [7]
    > в принципе неполучаем
    получаем, т.к. есть приписка
    > Какую именно строку выберит MySQL из таблица prop не имеет значения.
    вот это
    > 3      somename3
    из таблици prop.

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

    Да-да, про вообще любую недоглядел...:)))
  • Нат (01.08.08 00:57) [9]
    Полная неопределенность выбора ... зачем тогда присоединять?
    Надо как-то конкретизировать, по какому правилу выбирать...
    Всегда первую или последнюю, или с масимальным значением, медиану или по случайному закону...
    А совсем любую, это значит - на Ваше усмотрение, или советчика. Вот и выберите правило, наиболее удобное для Вас, если в задаче оно не указано.
    Что будет для Вас "выбрать любую"?
  • Anatoly Podgoretsky © (01.08.08 09:49) [10]
    Не возможно, prop.id = 3 не существует.
  • Dmitry S © (01.08.08 10:10) [11]
    Моя ошибка - надо было сразу выдать реальную задачу.
    Есть таблица, к примеру, новостей (item). У каждой новости могут быть фотографии (prop), сколько угодно.
    Нужно выбрать список новостей, и к каждой новости выбрать одну (любую) из ее фотографий.
  • ЮЮ © (01.08.08 10:16) [12]
    > Нужно выбрать список новостей, и к каждой новости выбрать
    > одну (любую) из ее фотографий.


    Заменю (любую) в своем ТЗ на (первую, c наименьшим Id), (последнююю), ...
    Сам сначала определись, прежде чем сервер терзать.
  • Dmitry S © (01.08.08 10:36) [13]

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

    Зачем лишний раз нагружать сервер. Пусть выберет ту, которую ему удобнее (например, первую в таблице).
  • Sergey13 © (01.08.08 10:59) [14]
    > [13] Dmitry S ©   (01.08.08 10:36)
    > например, первую в таблице

    Это которую?

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

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

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

    Ты предлагаешь ей проанализировать ВСЕ варианты и выбрать оптимальный? Может проще самому сформулировать ЧЕТКОЕ условие, чем предлагать серверу смотреть на абстрактное удобство выборки?
  • ЮЮ © (01.08.08 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 © (01.08.08 16:35) [18]
    > Dmitry S  (01.08.2008 10:10:11)  [11]

    Раз любую, то MAX или MIN и в случае подзапросов вариант ограничения выборки одной записью, в MySQL есть какое то средство для этого.
 
Конференция "Базы" » Помогите с запросом с присоединением (MySQL) [MySQL]
Есть новые Нет новых   [134435   +34][b:0][p:0.002]