Select 行按复合键的一部分与复合键的其余部分匹配?

Select rows by part of composite key that all match the remainder of composite key?

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

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 是几个不同表情符号之间的共享代码点,因此使计数过滤变得无用,并返回本例中集合中的最后一条记录。

我认为你应该使用有但没有子查询

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

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

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
                    );