mysql一对多连接中的唯一记录,没有DISTINCT或GROUP BY

时间:2014-02-26 21:01:00

标签: 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每个s_id可以包含多个d_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 |

现在,我们之前有一个GROUP BY d.id来获取独特的内容。这里的数据现在很大,所以我们再也不能这样做了。 SELECT DISTINCT d.id甚至更慢。

有什么想法吗?我提出的所有内容都会在其他地方造成问题。

1 个答案:

答案 0 :(得分:0)

将“JOIN m ON d.id = m.d_id”更改为“LEFT JOIN m ON d.id = m.d_id”是否可以完成您在寻找的内容?

我不确定我清楚地理解你的目标,但是“表m每行包含许多行”,我立即想知道你是否应该使用其他类型的联接来实现目标。