Объединение двух таблиц в MySQL, когда несколько строк в одной таблице относятся к одной строке в другой

#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. Ура ПРАВИЛЬНОМУ СОЕДИНЕНИЮ