当一个表中的多行与另一个表中的一行相关时,在MySQL中连接两个表

时间:2014-07-06 20:56:47

标签: mysql

我有两个表,module_configmodule_settings。后者包含具有默认值的行,前者包含要覆盖默认值的行。

我已经在这个小提琴中创建了包含一些测试行的表:http://sqlfiddle.com/#!2/ad4eb

以下是我的规格:

1)我想提供gid的列表。例如,提供100244850。 2)我希望查询为每个module_settings的每个设置(在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_settingsgid_specific等于1的所有行。这些行通过midname的唯一组合而不同。之后,它会为每个gid的每个设置返回一行。因此,对于module_setting等于midcurrency等于name的{​​{1}}行,它将返回4行,每hand_default个{ {1}},gid10024。剩下要做的唯一事情是决定与此行关联的值。如果48中有一行50等于module_configmodule_config.sidmodule_settings.id,则使用module_config.gid给出的值,否则使用gid给出的默认值。

正如你所看到的,我已经在脑海中制定了它,但是我无法理解这个问题。如果有人能说清楚,我会非常感激。

1 个答案:

答案 0 :(得分:0)

我使用过Teradata SQL。我相信如果你尝试,你可以找到SQL的等效语法。

除了你的两个表之外,我还使用了tbl3作为你说来自PHP数组的gid的来源。

第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

我希望这会有所帮助,并且我理解你的要求。