0

少し問題があります...これの最後のレコードを取得する必要があります:

id: 0
ユーザー名: 管理者
タイプ: ロジック
id_quest:1
risp:X

id: 1
ユーザー名: 管理者
タイプ: ロジック
id_quest:1
risp:X

id: 2
ユーザー名: 管理者
タイプ: ロジック
id_quest:1
risp:Y

id: 3
ユーザー名: Lol
type:logic
id_quest:2
risp:Z

id: 4
username: Lol
type:biology
id_quest:1
risp:K

id: 5
username: Lol
type:biology
id_quest:1
risp:Q

「type と 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 に答える