0

我有一个小问题......我需要为此检索最后的记录:

id:0
用户名:管理员
类型:逻辑
id_quest:1
risp:X

id:1
用户名:管理员
类型:逻辑
id_quest:1
risp:X

id:2
用户名:管理员
类型:逻辑
id_quest:1
risp:Y

id:3
用户名:大声笑
类型:逻辑
id_quest:2
risp:Z

id:4
用户名:大声笑
类型:生物学
id_quest:1
risp:K

id:5
用户名:大声笑
类型:生物学
id_quest:1
risp:Q

我想在“类型和 id_quest 相同”时检索最后一条记录,所以在这种情况下它应该给出:id:5、id:3 和 id:2。

这是我的数据库:

CREATE TABLE IF NOT EXISTS `question` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `type` varchar(50) NOT NULL,
  `id_quest` int(255) DEFAULT NULL,
  `risp` int(1) DEFAULT NULL,
  `non_contata` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=127 ;

INSERT INTO `question` (`id`, `username`, `type`, `id_quest`, `risp`, `non_contata`) VALUES
(91, 'Admin', 'biologia', 1, X, 0),
(92, 'Admin', 'biologia', 2, X, 0),
(93, 'Admin', 'logica', 3, X, 0),
(94, 'Admin', 'logica', 4, X, 0),
(73, 'J.J.J', 'biologia', 1, X, 0),
(74, 'J.J.J', 'biologia', 2, X, 0),
(75, 'J.J.J', 'biologia', 3, X, 0),
(76, 'J.J.J', 'biologia', 4, X, 0),
(109, 'Admin', 'biologia', 1, X, 0),
(110, 'Admin', 'biologia', 2, X, 0),
(111, 'Admin', 'biologia', 3, X, 0),
(112, 'Admin', 'biologia', 4, X, 0),

我希望该查询返回此 ID:112,111,110,109,76,75,74,73,94,93

4

3 回答 3

2

根据最后一条记录,您可能是指 id 最大的那个。

以下应该这样做:

select *
from t
where t.id in (select max(id)
               from t
               group by type, id_quest
               having count(*) > 1
              )
于 2012-06-01T13:39:05.547 回答
1

基本上,它应该使用分组来工作:

SELECT MAX(id)
FROM table
GROUP BY type, id_quest
ORDER BY 1 DESC

假设“最后一条记录”是指最大的 id,并且重复条目在表中的位置无关紧要。

在 MySQL 上,此查询返回:

mysql> SELECT max(ID) FROM test GROUP BY type, id_quest ORDER BY 1 DESC;
+---------+
| max(ID) |
+---------+
|       5 |
|       3 |
|       2 |
+---------+
3 rows in set (0.00 sec)

如果您只想比较直接的前辈,那么事情会变得有点复杂,您需要使用子查询。

SELECT id
FROM question q1
WHERE
IFNULL((SELECT q2.type=q1.type FROM question q2 WHERE q2.id > q1.id ORDER BY q2.id LIMIT 1),0) = 0
OR
IFNULL((SELECT q3.id_quest=q1.id_quest FROM question q3 WHERE q3.id > q1.id ORDER BY q3.id LIMIT 1),0) = 0
ORDER BY id DESC;

此查询将 id_quest 和 type 列与具有下一个最高 id 的列进行比较,如果相同则输出 1,否则输出 0。

但是,在一张大表上,这可能会非常低效,最好编写一个脚本来顺序遍历每一行并过滤掉重复项。

于 2012-06-01T13:38:18.993 回答
0

试试这个(如果 id 是唯一的或主键):

Select * from tableName where id in (Select Max(id) from tableName Group By type, id_quest)
于 2012-06-01T13:40:27.220 回答