[英]Select all rows grouped by NULLABLE column
我有一個表“ localization_string ”來保存用於應用程序本地化的字符串。 它用於保存多個應用程序的字符串(“提供程序”)。 字符串具有上下文(在其中顯示)。 一些字符串具有數字提供程序ID,有些具有NULL的提供程序ID(這些是“默認”字符串)。 一些上下文是由多個提供程序指定的(在單獨的行中)。
我想獲取特定提供商的所有字符串。 這包括所有“默認”字符串,但是當還使用提供者ID指定上下文時,則必須選擇此字符串。
我有這個簡化的表格結構可以用作說明:
一些簡化的示例行可能看起來像這樣:
id context | provider_id
----------------------------+------------
1 common.contract.header | NULL
2 common.contact.address | NULL
3 webcalc.home.title | NULL
4 webcalc.home.title | 1
5 webcalc.home.title | 2
因此,對於提供者1,我想獲取字符串ID 1,2,4。 不是#3,因為provider_id 1是用相同的上下文指定的,不是#2,因為它與#1不同。
-編輯-
這是“ localization_string”的CREATE TABLE命令:
CREATE TABLE `localization_string` (
`localization_string_id` int(11) NOT NULL AUTO_INCREMENT,
`context` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
`entity_created` datetime NOT NULL,
`entity_version` int(11) NOT NULL,
`locale` int(11) NOT NULL,
`provider` int(11) DEFAULT NULL,
PRIMARY KEY (`localization_string_id`),
KEY `fk_19cf27dcf987735b3f92dcbe7e2` (`locale`),
KEY `fk_2b9de3a0dacbfae475f526c12d0` (`provider`),
KEY `ind_be3921786d4fef28d84f42c24a2` (`context`,`locale`,`provider`),
CONSTRAINT `fk_19cf27dcf987735b3f92dcbe7e2` FOREIGN KEY (`locale`) REFERENCES `locale` (`locale_id`),
CONSTRAINT `fk_2b9de3a0dacbfae475f526c12d0` FOREIGN KEY (`provider`) REFERENCES `contract_provider` (`contract_provider_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
非常感謝您的幫助,因為我無法解決這個問題。
好的,我更好地了解您要做什么。
這是一個解決方案:
SELECT
COALESCE(p.localization_string_id, d.localization_string_id) AS localization_string_id,
d.context
FROM localization_string AS d
LEFT OUTER JOIN localization_string AS p
ON d.context = p.context AND p.provider = ?
WHERE d.provider IS NULL;
表d
是用於默認字符串的,我假設每個上下文總是會有一個默認條目。
表參考p
是給定提供者的可選字符串。 p.provider=?
上的條件 必須加入聯接條件,而不是WHERE子句。 如果該提供程序的給定上下文沒有行,則外部聯接將返回所有NULL。
然后,如果存在匹配項,則COALESCE()函數返回p
的特定行。 如果不是,它將默認為d
的默認行。
所以我遇到過類似的情況。 除了編寫某種腳本或讓查詢退出並查看表以查看是否存在帶有非null provider_id的腳本外,我還沒有找到其他方法。 就像是:
SELECT *
FROM test_tbl t
WHERE 1 = (CASE
WHEN provider_id IS NULL AND (SELECT 'Y'
FROM test_tbl x
WHERE x.context=t.context
AND x.app=t.app
AND x.provider IS NOT NULL) = 'Y'
THEN 0
ELSE 1)
group by app, context, provider_id;
我進行group_by'ed操作是因為我不知道是否可能有多行為'null'或'1'的行。 由於無法測試,因此不確定是否可以正常使用,但可能類似。
我想出了一個解決方案:
SELECT
cp.context,
cp.value
FROM
(
SELECT context, value
FROM localization_string
WHERE context LIKE 'common.%'
OR (context LIKE 'webcalc-v2.%' AND provider = 1)
) AS cp
INNER JOIN localization_string l
ON cp.context = l.context
WHERE (l.context LIKE 'common.%' OR l.context LIKE 'webcalc-v2.%')
AND provider IS NULL
歡迎提供更多具有說明的優化解決方案...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.