mysql中的唯一记录一对多连接而不使用DISTINCT或GROUP BY
以下是基本查询:mysql中的唯一记录一对多连接而不使用DISTINCT或GROUP BY,mysql,sql,Mysql,Sql,以下是基本查询: SELECT some_columns FROM d JOIN m ON d.id = m.d_id JOIN s ON s.id = m.s_id JOIN p ON p.id = s.p_id WHERE some_criteria ORDER BY d.date DESC LIMIT 25 表m可以包含每个d\u id的多个s\u id。下面是一个超级简单的示例: +--------+--------+---
SELECT
some_columns
FROM
d
JOIN
m ON d.id = m.d_id
JOIN
s ON s.id = m.s_id
JOIN
p ON p.id = s.p_id
WHERE
some_criteria
ORDER BY
d.date DESC
LIMIT 25
表m
可以包含每个d\u id
的多个s\u id
。下面是一个超级简单的示例:
+--------+--------+------+
| id | d_id | s_id |
+--------+--------+------+
| 317354 | 291220 | 642 |
| 317355 | 291220 | 32 |
+--------+--------+------+
2 rows in set (0.00 sec)
这是我们想要的。但是,很明显,它在这个特定的查询中生成了重复的d
记录
这些表有很多列,由于数据的敏感性,我需要对这些列进行向下编辑,但以下是与此查询相关的基本结构:
| d | CREATE TABLE `d` (
`id` bigint(22) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB |
| m | CREATE TABLE `m` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`d_id` bigint(20) NOT NULL,
`s_id` bigint(20) NOT NULL,
`is_king` binary(1) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `d_id` (`d_id`),
KEY `is_king` (`is_king`),
KEY `s_id` (`s_id`)
) ENGINE=InnoDB |
| s | CREATE TABLE `s` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`p_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `p_id` (`p_id`)
) ENGINE=InnoDB |
| p | CREATE TABLE `p` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB |
现在,以前,我们有一个d.id的组来获取unique。这里的数据现在是巨大的,所以我们不能再现实地这样做了<代码>选择不同的d.id
更慢
有什么想法吗?我想到的每件事都会在其他地方产生问题。将“在d.id=m.d\u id上连接m”更改为“在d.id=m.d\u id上左连接m”是否实现了您在这里寻找的目标
我不确定我是否清楚地理解了您的目标,但“表m每个d包含许多行”立即让我想知道您是否应该使用其他类型的联接来完成您的目标。子查询而不是联接?请为每个联接发布
SHOW CREATE table
。它们是否定义了索引?它们是否在连接列上定义了外键
关系(强制执行适当的索引)?如果你能保证所有的连接都能得到匹配,你就可以做选择限制,然后再做连接。如果你做不到,你将以少于25行结束。。。您对s_id不感兴趣,还是只想随机选择其中的一个?基于该示例结果集,duplicate不是正确的词d_id
是重复的是,但相对于其他列,它仍然是不同的。对于d_id
的任何给定值,应选择哪些其他值(id,s_id
)?最高的,最低的,最近的<如果没有像MAX()、MIN()、COUNT()
这样的聚合,则code>groupby没有特别的意义,不管MySQL允许您使用它做什么-您需要特定于RDBMS,它应该返回哪些与分组列相关的其他值(d_id
)