繁体   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