我有两个表,module_config
和module_settings
。后者包含具有默认值的行,前者包含要覆盖默认值的行。
我已经在这个小提琴中创建了包含一些测试行的表:http://sqlfiddle.com/#!2/ad4eb。
以下是我的规格:
1)我想提供gid
的列表。例如,提供100
,24
,48
,50
。
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_settings
中gid_specific
等于1的所有行。这些行通过mid
和name
的唯一组合而不同。之后,它会为每个gid
的每个设置返回一行。因此,对于module_setting
等于mid
且currency
等于name
的{{1}}行,它将返回4行,每hand_default
个{ {1}},gid
,100
和24
。剩下要做的唯一事情是决定与此行关联的值。如果48
中有一行50
等于module_config
且module_config.sid
是module_settings.id
,则使用module_config.gid
给出的值,否则使用gid
给出的默认值。
正如你所看到的,我已经在脑海中制定了它,但是我无法理解这个问题。如果有人能说清楚,我会非常感激。
答案 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
我希望这会有所帮助,并且我理解你的要求。