У меня есть две таблицы: одна описывает предметы, которые вы можете купить, а другая хранит «необходимые предметы» для покупки других предметов. В первой таблице есть некоторые предметы, которые требуют других предметов в качестве формы торговли. А иногда нужно определенное количество требуемых предметов. Вот схема двух таблиц:
+---------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------+------+-----+---------+----------------+
| storeID | int(5) unsigned | NO | PRI | NULL | auto_increment |
| itemID | int(10) | NO | | NULL | |
| quantity | int(10) | NO | | NULL | |
| cost | int(10) | NO | | NULL | |
+---------------+-----------------+------+-----+---------+----------------+
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| parentID | int(10) | NO | | NULL | |
| itemID | int(10) | NO | | NULL | |
| quantity | int(10) | NO | | NULL | |
+----------+---------+------+-----+---------+-------+
Вторая таблица связана с первой storeID <-> parentID
. предметы в магазине могут иметь много необходимых предметов.
Проблема: мне нужно выполнить запрос, который возвращает все элементы в магазине, но ТАКЖЕ показывает все необходимые элементы и их количество. Это должно выглядеть примерно так:
4 x Item1,5 x Item2
У меня есть этот текущий запрос:
SELECT a.*, b.typeName, GROUP_CONCAT(CONCAT(c.quantity, " x ", d.typeName)) as `reqItems`
FROM lpStore a
INNER JOIN typeNames b ON (a.typeID = b.typeID)
INNER JOIN lpRequiredItems c ON (a.storeID = c.parentID)
INNER JOIN typeNames ON (d.typeID = c.typeID)
GROUP BY c.parentID
ORDER BY a.cost ASC
typeNames
— это просто таблица, которая связывает идентификаторы элементов с их фактическими именами.
Теперь этот запрос работает хорошо, однако кажется, что он не включает элементы, которые НЕ ИМЕЮТ ОБЯЗАТЕЛЬНЫХ ЭЛЕМЕНТОВ. Я подозреваю, что это одно из JOINS вместе с GROUP BY (может быть, группирует все значения NULL, которые не существуют в этой таблице?), Однако я еще не смог понять это. Мне нужно, чтобы в этом столбце возвращалось пустое значение или NULL, если ничего не требуется.
РЕДАКТИРОВАТЬ: Пример данных
Я удалил объединение таблиц с таблицей имен элементов для простоты.
Примеры данных доступны здесь: http://www.sqlfiddle.com/#!2/d8dca/ 1а>
Фактические результаты:
+---------+--------+------+----------+-----------------------------+
| storeID | typeID | cost | quantity | reqItems |
+---------+--------+------+----------+-----------------------------+
| 1 | 2514 | 2000 | 3 | 5 x 3668,10 x 4825 |
| 3 | 8785 | 5000 | 2 | 1 x 4875,15 x 1102,5 x 9813 |
| 4 | 579 | 1500 | 5 | NULL |
+---------+--------+------+----------+-----------------------------+
Ожидаемые результаты:
+---------+--------+------+----------+-----------------------------+
| storeID | typeID | cost | quantity | reqItems |
+---------+--------+------+----------+-----------------------------+
| 1 | 2514 | 2000 | 3 | 5 x 3668,10 x 4825 |
| 2 | 3199 | 1000 | 1 | NULL |
| 3 | 8785 | 5000 | 2 | 1 x 4875,15 x 1102,5 x 9813 |
| 4 | 579 | 1500 | 5 | NULL |
+---------+--------+------+----------+-----------------------------+