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