以下是基本查询:
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
甚至更慢。
有什么想法吗?我提出的所有内容都会在其他地方造成问题。
答案 0 :(得分:0)
将“JOIN m ON d.id = m.d_id”更改为“LEFT JOIN m ON d.id = m.d_id”是否可以完成您在寻找的内容?
我不确定我清楚地理解你的目标,但是“表m每行包含许多行”,我立即想知道你是否应该使用其他类型的联接来实现目标。