按复合键的一部分选择所有与复合键的其余部分匹配的行?

时间:2016-05-29 20:25:10

标签: mysql sql composite-primary-key

我有一张名为" emoji"它存储每个表情符号的代码点。

CREATE TABLE `emoji` (
  `emoji_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `code_point` int(10) unsigned NOT NULL,
  `order` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`emoji_id`,`code_point`),
  KEY `code_point, order` (`code_point`,`order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO emoji (emoji_id, code_point, `order`) VALUES(1, 127467, 0), (1, 127479, 1), (2, 127472, 0), (2, 127479, 1);

SQLFiddle

鉴于代码点127467和127479,我如何只能获取共享相同emoji_id(在这种情况下为1)的行?

我尝试过以下方法:

SELECT
    emoji_id,
    code_point,
    `order`
    FROM
    emoji
WHERE
    code_point IN (127467, 127479) AND
    emoji_id IN (
        SELECT
            emoji_id
        FROM
            emoji
        GROUP BY
            emoji_id
        HAVING
            COUNT(emoji_id) > 1
    )

但是127479是几个不同表情符号中的共享代码点,因此使得计数过滤无效,并且还返回此示例中集合中的最后一条记录。

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式获取表情符号列表:

SELECT emoji_id
FROM emoji
WHERE code_point IN (127467, 127479) 
GROUP BY emoji_id
HAVING COUNT(emoji_id) = 2;

您可以将其合并到查询中以获取详细信息:

select e.*
from emoji
where e.emoji_id in (SELECT emoji_id
                     FROM emoji
                     WHERE code_point IN (127467, 127479) 
                     GROUP BY emoji_id
                     HAVING COUNT(emoji_id) = 2
                    );

答案 1 :(得分:0)

我认为你可以使用没有子查询的b ut

SELECT
distinct 
emoji_id,
code_point,
`order`
FROM  emoji
WHERE  code_point IN (127467, 127479) 
having cont(*)  = 2;