簡體   English   中英

選擇按NULLABLE列分組的所有行

[英]Select all rows grouped by NULLABLE column

我有一個表“ localization_string ”來保存用於應用程序本地化的字符串。 它用於保存多個應用程序的字符串(“提供程序”)。 字符串具有上下文(在其中顯示)。 一些字符串具有數字提供程序ID,有些具有NULL的提供程序ID(這些是“默認”字符串)。 一些上下文是由多個提供程序指定的(在單獨的行中)。

我想獲取特定提供商的所有字符串。 這包括所有“默認”字符串,但是當還使用提供者ID指定上下文時,則必須選擇此字符串。

我有這個簡化的表格結構可以用作說明:

  • 上下文,varchar,不為null
  • provider_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM