Heim >Backend-Entwicklung >PHP-Tutorial >MySQL erhält gruppierte aktuelle Daten
Die Quelldaten lauten wie folgt:
Der gewünschte Effekt besteht darin, die neuesten Daten gruppiert nach der Ziel-ID zu erhalten, die lautet:
Ich denke derzeit über zwei Optionen nach:
Option 1: Finden Sie die größte Daten-ID über dieselbe Tabellenunterabfrage oder einen Join
Man kann es auch anders schreiben:
<code>select * from (select * from track where type='task' and target_id in(...) ORDER BY time DESC ) as temp GROUP BY target_id</code>
Option 2: Abfrage in zwei Schritten, zuerst die maximale ID in PHP abfragen und dann die Listendaten über das ID-Array abfragen
Ich möchte fragen: Gibt es eine andere, einfachere Möglichkeit, mit diesem Problem umzugehen?
Diese Art von Nachfrage sollte relativ häufig vorkommen!
=====Struktur und Daten anhängen=====
<code>DROP TABLE IF EXISTS `track`; CREATE TABLE `track` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` varchar(50) NOT NULL DEFAULT '' COMMENT 'task => 任务跟进,project => 项目跟进 ', `target_id` int(11) DEFAULT '0' COMMENT '跟进目标ID', `user_id` int(11) DEFAULT '0' COMMENT '跟进用户', `user_name` varchar(100) DEFAULT '' COMMENT '跟进用户名称', `content` varchar(500) DEFAULT '' COMMENT '跟进内容', `time` int(11) DEFAULT '0' COMMENT '跟进时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='跟进记录表'; -- ---------------------------- -- Records of track -- ---------------------------- INSERT INTO `track` VALUES ('1', 'task', '67', '1', '超级管理员', '无所谓...', '1467774850'); INSERT INTO `track` VALUES ('2', 'task', '67', '1', '超级管理员', 'TTTT', '1467777620'); INSERT INTO `track` VALUES ('7', 'task', '67', '1', '超级管理员', '只耗损', '1468288894'); INSERT INTO `track` VALUES ('8', 'task', '34', '1', '超级管理员', 'STS', '1468288917'); INSERT INTO `track` VALUES ('9', 'task', '34', '1', '超级管理员', '吊顶', '1468288954');</code>
Die Quelldaten lauten wie folgt:
Der gewünschte Effekt besteht darin, die neuesten Daten gruppiert nach der Ziel-ID zu erhalten, die lautet:
Derzeit werden zwei Optionen in Betracht gezogen:
Option 1: Finden Sie die größte Daten-ID durch Unterabfragen oder Joins in derselben Tabelle
Man kann es auch anders schreiben:
<code>select * from (select * from track where type='task' and target_id in(...) ORDER BY time DESC ) as temp GROUP BY target_id</code>
Option 2: Abfrage in zwei Schritten, zuerst die maximale ID in PHP abfragen und dann die Listendaten über das ID-Array abfragen
Ich möchte fragen: Gibt es eine andere, einfachere Möglichkeit, mit diesem Problem umzugehen?
Diese Art von Nachfrage sollte relativ häufig vorkommen!
=====Struktur und Daten anhängen=====
<code>DROP TABLE IF EXISTS `track`; CREATE TABLE `track` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` varchar(50) NOT NULL DEFAULT '' COMMENT 'task => 任务跟进,project => 项目跟进 ', `target_id` int(11) DEFAULT '0' COMMENT '跟进目标ID', `user_id` int(11) DEFAULT '0' COMMENT '跟进用户', `user_name` varchar(100) DEFAULT '' COMMENT '跟进用户名称', `content` varchar(500) DEFAULT '' COMMENT '跟进内容', `time` int(11) DEFAULT '0' COMMENT '跟进时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='跟进记录表'; -- ---------------------------- -- Records of track -- ---------------------------- INSERT INTO `track` VALUES ('1', 'task', '67', '1', '超级管理员', '无所谓...', '1467774850'); INSERT INTO `track` VALUES ('2', 'task', '67', '1', '超级管理员', 'TTTT', '1467777620'); INSERT INTO `track` VALUES ('7', 'task', '67', '1', '超级管理员', '只耗损', '1468288894'); INSERT INTO `track` VALUES ('8', 'task', '34', '1', '超级管理员', 'STS', '1468288917'); INSERT INTO `track` VALUES ('9', 'task', '34', '1', '超级管理员', '吊顶', '1468288954');</code>
Fügen Sie die Daten mit der größten ID in die temporäre Tabelle ein
<code>CREATE TEMPORARY TABLE tmp_id(`id` int(11) not null,PRIMARY KEY (`id`) ) </code>
Dann
<code>INSERT INTO tmp_id SELECT max(`id`) as id FROM track GROUP BY target_id </code>
Dann einfach beitreten
Abschließend empfiehlt es sich, die temporäre Tabelle explizit zu löschen
<code>DROP TEMPORARY TABLE IF EXISTS tmp_id</code>
Ich denke, Option 1A ist ziemlich gut, aber warum müssen Sie eine Bedingung für target_id schreiben? Wenn Sie sie nicht schreiben, wird das Ergebnis dasselbe sein.
Im Allgemeinen wird Option 1 verwendet. Es gibt eine andere Möglichkeit, Option 1 zu schreiben
<code>select * from track where id in(select substring_index(group_concat(id order by id desc),',',1) as maxid from track group by target_id);</code>