2013-04-04 3 views
0

Этот SQL-запрос заставил меня задуматься о том, как это сделать.mysql query left join или group_concat или?

У меня есть следующая две MySQL таблица:

[items] 
     id 
     title 

    [ledger] 
     id 
     itemid 
     qty 
     stockcode 

я выступаю избранный из таблицы [элементы], где ID = 123.I также хочет вернуть столбец «Extras» в который совпадает с items.id = ledger.itemid и представляет собой список кодов [регистров], разделенных запятыми, которые имеют SUM (qty)> 0. Сумма отражает, что элемент может иметь записи в реестре, показывающие количество +5 и -2 изображений = всего 3 изображения. 3 изображения будут отражены в столбце дополнительных функций как «изображение, изображение, изображение».

select 
     id 
     ,title 
     ,???? as extras 
    from 
     items 
    where 
     items.id = 123 

Пример результат для столбца 'Extras' может быть:

bold,highlight,border,image,image,image 

, которая отражает результат из таблицы лицевой с суммой (кол-во)> 0

bold (1) 
    highlight (1) 
    border (1) 
    image (3) 

ответ

0

Вы, наверное, хотите сделать LEFT JOIN и GROUP_CONCAT и HAVING, чтобы получить информацию, которую вы ищете:

SELECT i.id, i.title, GROUP_CONCAT(l.stockcode SEPARATOR ',') extras 
FROM items i 
LEFT JOIN ledger l ON i.id = l.itemid 
WHERE i.id = 123 
HAVING SUM(l.qty) > 0 

Смотреть это SQL Fiddle

0

попробовать что-то вроде

SELECT id, title, extras 
FROM items 
JOIN (
    SELECT itemsid, GROUP_CONCAT(stockcode SEPERATOR ',') extras 
    FROM ledger 
    GROUP BY itemsid 
    HAVING SUM(qty) > 0 
) t ON t.itemsid = items.id 
WHERE id=123 
+0

Я смотрел делать это таким образом, но был обеспокоен тем, что подзапрос на столе весь лицевом (который потенциально может быть огромным) может привести к в проблемах с производительностью по трассе? – regan

+0

иногда вы просто должны делать то, что вам нужно. если производительность становится проблемой, тогда вы можете захотеть создать [материализованное представление] (http://en.wikipedia.org/wiki/Materialized_view) запроса GROUP_CONCAT и использовать это вместо –

+0

. Я опубликовал еще один вопрос об использовании пользовательская переменная в подзапросе - не уверен, что что-то вдоль этих строк предоставит другое другое возможное решение (я их раньше не использовал, поэтому не знаю ограничений) - http://stackoverflow.com/questions/15823288/ а-MySQL-User-переменного-за-строки установленного – regan