2013-10-13 9 views
1

У меня есть следующий оператор выбора:MySQL: Как выбрать данные из столбца в другой таблице

SELECT 
    items.id, 
    items.name AS item_name, 
    items.tobuy, 
    items.list_id, 
    items.note, 
    items.unit, 
    MIN(NULLIF(packages.ppu, 0)) AS mppu, 
    packages.price AS mprice, 
    items._deleted 
    FROM 
    items 
    INNER JOIN 
    lists ON lists.id = items.list_id 
    LEFT JOIN 
    packages ON items.id = packages.item_id 
    WHERE 
    lists.user_id = 1 AND 
    items._deleted = '0' 
    GROUP BY 
    items.id 
    ORDER BY 
    tobuy DESC, 
    item_name 

Но что я действительно хочу это цена прийти из пакета, который имеет минимальную ППУ (который не обязательно пакет с минимальной ценой).

Любые идеи?

Примеры записей:

Таблица: Предметы:

id, name, tobuy, list_id, note, unit, _deleted 
95, test1, 1,  1,  null, null, 0 
69, test2, 1,  1,  null, null, 0 
194, test3, 1,  1,  null, null, 0 
162, test4, 1,  1,  null, null, 0 

Таблица: списки:

id, name, user_id 
1, list1, 1 

Таблица: Пакеты:

id, item_id, price, ppu 
392, 95,  0,  0 
117, 95,  13.49, 0.078 
391, 95,  0,  0 
386, 69,  0,  0 
387, 69,  0,  0 
388, 69,  0,  0 
368, 194,  4.58, 0.138 
18, 194,  3.38, 0.177 
17, 194,  3.88, 0.144 

Результаты должны быть четыре пункта с фоллом Дополнительная информация:

id, item_name, tobuy, list_id, note, unit, mppu, mprice, _deleted 
95, test1,  1,  1,  null, null, 0.078, 13.49, 0 
69, test2,  1,  1,  null, null, 0,  0,  0 
194, test3,  1,  1,  null, null, 0.138, 4.58, 0 
162, test4,  1,  1,  null, null, 0,  0,  0 

Обратите внимание, что в пункте 162 не имеется соответствующих пакетов, но оно все еще отображается в списке. Это является причиной для «LEFT JOIN»

КСТАТИ «mppu» означает «минимальная цена за единицу»

+0

Вопрос, почему вы используете LEFT JOIN вместо INNER JOIN? Это делает ваш запрос медленнее. Кроме того, я бы, по крайней мере, сначала отфильтровал списки на user_id, а затем присоединился к этому с остальными. – Ashalynd

+0

, пожалуйста, укажите образцы записей с желаемым результатом. –

+0

@Ashalynd, я сменил один из операторов LEFT JOIN на INNER JOIN, но я не могу изменить другой, потому что мне все еще нужно перечислять элементы, которые не имеют соответствующих данных в таблице пакетов. – Simpler

ответ

0

следующих работам, чтобы получить результаты, которые я искал.

SELECT * FROM ( 
    SELECT 
    items.id, 
    items.name AS item_name, 
    items.tobuy, 
    items.list_id, 
    items.note, 
    items.unit, 
    NULLIF(packages.ppu, 0) AS mppu, 
    packages.price AS mprice, 
    items._deleted 
    FROM 
    items 
    INNER JOIN 
    lists ON lists.id = items.list_id 
    AND lists.user_id = 1 
    LEFT JOIN 
    packages ON packages.item_id = items.id 
    WHERE 
    items._deleted = '0' 
    ORDER BY 
    tobuy DESC, 
    item_name, 
    IFNULL(mppu, 999999)) x 
GROUP BY 
    x.id 
ORDER BY 
    tobuy DESC, 
    item_name 

Спасибо всем за вход, чтобы получить меня через это.

0

вы можете попробовать на 2-й слева: packages ON (packages.item_id = items.id and select min(packages.ppu) from packages where item_id=item.id)

также убедитесь, что изменить group by to items.id не проверено

+0

я заменил мой LEFT JOIN с помощью следующей 'LEFT JOIN пакетов ПО (packages.item_id = items.id и выберите мин (packages.ppu) из пакетов где packages.item_id = items.id)' но что возвращает синтаксическую ошибку в строке выбора? – Simpler

+0

Может быть, я что-то пропустил, он не тестировался Я думаю, я ошибочно набрал пакеты два раза, – Omiga

+0

Я исправил орфографические ошибки (как вы можете видеть в моем предыдущем посте).Что вы подразумеваете под словом «это не проверено»? – Simpler

0

С mysql это удивительно симплекс.

Сортировать по ррпу и переместить группу, к внешнему запросу

SELECT * FROM (
    SELECT 
    items.id, 
    items.name AS item_name, 
    items.tobuy, 
    items.list_id, 
    items.note, 
    items.unit, 
    MIN(NULLIF(packages.ppu, 0)) AS mppu, 
    packages.price AS mprice, 
    items._deleted 
    FROM items 
    INNER JOIN lists 
    ON lists.id = items.list_id 
    AND lists.user_id = 1 
    LEFT JOIN packages 
    ON items.id = packages.item_id 
    WHERE items._deleted = '0' 
    ORDER BY 
    ppm, 
    tobuy DESC, 
    item_name) x 
GROUP BY 
    id 
+0

Я изменил опечатку в разделе ORDER BY от ppm до mppu, но этот код возвращает только один элемент. – Simpler

+0

Мне удалось получить этот метод для получения желаемых результатов 1) удаление «MIN» 2) добавление 'ORDER BY tobuy DESC, item_name' снова после оператора GROUP BY' и 3) изменение первого 'ORDER BY'' 'IFNULL (mppu, 999999)' , но этот запрос выполняется медленно. Любые предложения по ускорению этого? – Simpler

+0

Переместить неключевое условие в списки из WHERE в join ON - см. Править. Примечание. Я еще не включил ваши другие изменения. – Bohemian

Смежные вопросы