#mysql
#mysql
Вопрос:
У меня есть две таблицы, module_config
и module_settings
. Последняя содержит строки со значениями по умолчанию, а первая содержит строки, которые должны переопределять значения по умолчанию.
Я создал таблицы с некоторыми тестовыми строками в этом скрипте: http://sqlfiddle.com /#!2/ad4eb .
Вот мои спецификации:
1) Я хочу предоставить список gid
s. Например, предоставьте 100
, 24
, 48
, 50
module_settings
. 2) Я хочу, чтобы запрос возвращал строку для каждого параметра (указанного в gid
) для каждого из них, для каждого из них. Для каждого из них. Оно должно игнорировать любую module_settings
строку, где module_settings.gid_specific
равно 0
. 3) value
будет равно соответствующему значению, указанному в module_config
, если эта строка существует, в противном случае initial
значению, указанному в module_settings
.
С помощью вышеупомянутой скрипки я хотел бы что-то, что может возвращать следующее (для ввода вышеуказанных 4 gid
значений):
| mid----- | gid | name-------- | value |
| currency | 100 | hand_default | 12--- |
| currency | 24- | hand_default | 17--- |
| currency | 48- | hand_default | 29--- |
| currency | 50- | hand_default | 0---- |
| currency | 100 | bank_default | 0---- |
| currency | 24- | bank_default | 0---- |
| currency | 48- | bank_default | 0---- |
| currency | 50- | bank_default | 0---- |
Таким образом, сначала он находит все строки в, module_settings
где gid_specific
равно 1. Эти строки отличаются уникальной комбинацией mid
и name
. После этого он возвращает строку для каждого из этих параметров для каждого gid
. Таким образом, для module_setting
строки, где mid
равно currency
и name
равно hand_default
, будет возвращено 4 строки, по одной для каждого gid
из 100
, 24
, 48
и 50
. Единственное, что осталось сделать, это решить, какое значение связать с этой строкой. Если существует строка в, module_config
где module_config.sid
равно module_settings.id
и module_config.gid
является gid
рассматриваемой, то используйте значение, заданное module_config.value
, в противном случае используйте значение по умолчанию, заданное module_settings.initial
.
Как вы можете видеть, я сформулировал это в своей голове, но у меня просто не укладывается в голове поместить это в оператор запроса. Если кто-нибудь может пролить некоторый свет, я был бы очень благодарен.
Комментарии:
1. Для предоставленных вами данных откуда взялось бы
gid
=50
?2. В PHP-коде будет массив
gid
значений (которые будут извлечены из другой таблицы в БД).3. Пожалуйста, посмотрите на свой fiddle и убедитесь, что ваш вывод может быть получен из таблиц fiddle.
4. Вы имеете в виду, потому что нет строки с
gid
=50
? Я намеренно исключил это из таблицы, поскольку PHP-код может предоставлятьgid
значения, которые еще не были введены вmodule_config
таблицу, и в этом случае следует использовать значение по умолчанию, заданноеmodule_settings.initial
.5. Если то, о чем я спрашиваю, тогда невозможно, можно ли вместо этого вывести строку для каждого значения по умолчанию (заданного
module_settings
), а затем строку для всего вmodule_config
таблице? Таким образом, я мог бы проанализировать итоговую таблицу (выше) с помощью некоторого PHP.
Ответ №1:
Я использовал Teradata SQL. Я уверен, что если вы попробуете, вы сможете найти эквивалентный синтаксис для SQL.
В дополнение к вашим двум таблицам я использовал tbl3 в качестве источника gid, который, как вы говорите, поступает из массива PHP.
Шаг 1: Перекрестное объединение module_settings и module_config
SELECT mid,gid,name, b.value1
FROM IBB_APP.module_settings a, IBB_APP.module_config b
WHERE gid_specific = 1;
Это приводит к
mid gid name value1
-------------------------------- ----------- -------------------------------- ----------
currency 100 hand_default 12
currency 24 hand_default 17
currency 48 hand_default 29
currency 100 bank_default 12
currency 24 bank_default 17
currency 48 bank_default 29
Шаг 2. Включая tbl3, который также выдает gid = 50.
SELECT mid,c.gid,name,
CASE WHEN b.gid = c.gid THEN b.value1
WHEN b.gid IS NULL THEN a.initial1 END AS value1
FROM IBB_APP.module_settings a, IBB_APP.module_config b
RIGHT OUTER JOIN IBB_APP.tbl3 c ON (b.gid = c.gid)
WHERE gid_specific = 1
ORDER BY name,c.gid;
Результатом является
mid gid name value1
-------------------------------- ----------- -------------------------------- ----------
currency 24 bank_default 17
currency 48 bank_default 29
currency 50 bank_default 0
currency 100 bank_default 12
currency 24 hand_default 17
currency 48 hand_default 29
currency 50 hand_default 0
currency 100 hand_default 12
Я надеюсь, что это помогает и что я правильно понял ваши требования.
Комментарии:
1. Ура ПРАВИЛЬНОМУ СОЕДИНЕНИЮ