MySQL查询订购两列,一个ASC另一个DESC
Posted
技术标签:
【中文标题】MySQL查询订购两列,一个ASC另一个DESC【英文标题】:MySQL query to order two column, one ASC another DESC 【发布时间】:2013-02-25 02:55:27 【问题描述】:我正在尝试准备一个主题明智的优点列表。我正在使用这个mysql query
:
SELECT *
FROM results
ORDER BY qid ASC,
marks DESC
结果是:
但我需要的是这样的(查看标记列,我需要得到相同的qid
行,按marks
排序):
请任何人帮助我。
更新:
这是result.sql
文件,用于在您的电脑中创建表格。
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Mar 09, 2013 at 05:40 PM
-- Server version: 5.5.27
-- PHP Version: 5.4.7
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `ges_omeca`
--
-- --------------------------------------------------------
--
-- Table structure for table `results`
--
CREATE TABLE IF NOT EXISTS `results` (
`exam_id` int(11) NOT NULL AUTO_INCREMENT,
`sid` varchar(50) NOT NULL,
`qid` varchar(100) NOT NULL,
`corrects` int(3) NOT NULL,
`total_qs` int(3) NOT NULL,
`marks` float NOT NULL,
`date_time` datetime NOT NULL COMMENT 'DateTime when user submits the answer script.',
PRIMARY KEY (`exam_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;
--
-- Dumping data for table `results`
--
INSERT INTO `results` (`exam_id`, `sid`, `qid`, `corrects`, `total_qs`, `marks`, `date_time`) VALUES
(1, 'guest', 'EN_(Set-B)_(07.02.13)', 37, 40, 36.25, '2023-02-13 01:10:00'),
(2, 'guest', 'EN_(Set-B)_(07.02.13)', 11, 40, 10.25, '2013-02-23 01:56:58'),
(3, 'guest', 'P1_(Set-D)_(10.02.13)', 2, 100, 36.25, '2013-02-23 03:42:57'),
(4, 'guest', 'P1_(Set-B)_(09.02.13)', 5, 40, 5, '2013-02-23 03:46:59'),
(5, 'guest', 'EN_(Set-A)_(07.02.13)', 1, 40, 0.25, '2013-02-23 04:46:59'),
(6, 'guest', 'EN_(Set-A)_(07.02.13)', 6, 40, 5.5, '2013-02-23 04:59:59'),
(7, 'guest', 'P1_(Set-D)_(10.02.13)', 10, 100, 9.25, '2013-02-24 08:57:17'),
(8, 'guest', 'P1_(Set-B)_(09.02.13)', 5, 40, 5, '2013-02-24 01:23:50'),
(9, 'guest', 'EN_(Set-D)_(07.02.13)', 0, 40, -0.5, '2013-02-25 12:45:33'),
(10, 'guest', 'EN_(Set-D)_(07.02.13)', 2, 40, 1.5, '2013-02-25 01:45:38'),
(11, 'guest', 'P1_(Set-B)_(09.02.13)', 2, 40, 2, '2013-02-25 04:06:28'),
(12, 'guest', 'EN_(Set-C)_(07.02.13)', 5, 40, 4.5, '2013-02-25 04:42:27'),
(13, 'guest', 'P1_(Set-C)_(10.02.13)', 6, 40, 6, '2013-02-25 05:00:57');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
【问题讨论】:
日期2023-02-13
对我来说似乎是合法的。你是如何产生想要的结果的?
这是我编辑的 :D,如果没有 qid
和 marks
,请不要想其他任何事情 :)
【参考方案1】:
这正是你需要的:
SELECT *
FROM results
ORDER BY SUBSTRING( qid
FROM 1
FOR 1 ) ASC , marks DESC
【讨论】:
【参考方案2】:我不太明白您的问题,但查看结果,我注意到记录按qid
排序,其中包含EN
,是结果列表中的第一个。
试试看,
SELECT *
FROM tableName
ORDER BY CASE WHEN qid LIKE 'EN%' THEN 0
WHEN qid LIKE 'P1%' THEN 1
ELSE 2
END ASC,
marks DESC
【讨论】:
但该表可能包含许多内容,而不仅仅是 EN 和 P1。这就是为什么我喜欢订购它们。 @CoolBrain 这是自定义排序。您需要手动获取它的列表,或者如果您不这样做,请在表上添加一列,将您的记录分组并可以通过该列进行排序。 @JW.- 好的,我会按照你的建议添加一个列,但是什么样的列?请在 SQLFiddle 中更新...【参考方案3】:这可能会对您有所帮助:
SELECT *
FROM results
ORDER BY SUBSTRING(qid FROM 1 FOR 9) ASC,
marks DESC
【讨论】:
以上是关于MySQL查询订购两列,一个ASC另一个DESC的主要内容,如果未能解决你的问题,请参考以下文章