Heim >Backend-Entwicklung >PHP-Tutorial >MySQL erhält gruppierte aktuelle Daten

MySQL erhält gruppierte aktuelle Daten

WBOY
WBOYOriginal
2016-08-04 09:21:461414Durchsuche

Die Quelldaten lauten wie folgt:

MySQL erhält gruppierte aktuelle Daten

Der gewünschte Effekt besteht darin, die neuesten Daten gruppiert nach der Ziel-ID zu erhalten, die lautet:

MySQL erhält gruppierte aktuelle Daten

Ich denke derzeit über zwei Optionen nach:
Option 1: Finden Sie die größte Daten-ID über dieselbe Tabellenunterabfrage oder einen Join

MySQL erhält gruppierte aktuelle Daten

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>

Antwortinhalt:

Die Quelldaten lauten wie folgt:

MySQL erhält gruppierte aktuelle Daten

Der gewünschte Effekt besteht darin, die neuesten Daten gruppiert nach der Ziel-ID zu erhalten, die lautet:

MySQL erhält gruppierte aktuelle Daten

Derzeit werden zwei Optionen in Betracht gezogen:
Option 1: Finden Sie die größte Daten-ID durch Unterabfragen oder Joins in derselben Tabelle

MySQL erhält gruppierte aktuelle Daten

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>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn