简体   繁体   English

MySQL查询命令两列,一个ASC另一个DESC

[英]MySQL query to order two column, one ASC another DESC

I am trying to prepare a subject wise merit list. 我正在努力准备一个明智的优点列表。 I am using this mysql query : 我正在使用这个mysql query

SELECT * 
FROM results 
ORDER BY qid ASC,
    marks DESC

Result is: 结果是:

在此输入图像描述

But what I need is like this (look at marks column, I need to get same qid rows, ordered by marks ): 但我需要的是这样的(看标记列,我需要得到相同的qid行,按marks排序):

在此输入图像描述

Please anyone help me. 请有人帮帮我。

Update: And this is result.sql file to create the table in your pc. 更新:这是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 */;

This is exactly what you need: 这正是您所需要的:

SELECT * 
FROM results
ORDER BY SUBSTRING( qid
FROM 1 
FOR 1 ) ASC , marks DESC

I didn't really understand your question but looking on the result, I've noticed that records are sorted by qid which contains EN to be the first on the result list. 我没有真正理解你的问题但是看结果,我注意到记录按qid排序,其中包含EN作为结果列表中的第一个。

give this a try, 尝试一下,

SELECT  *
FROM    tableName
ORDER   BY  CASE WHEN qid LIKE 'EN%' THEN 0 
                WHEN qid LIKE 'P1%' THEN 1
                ELSE 2
            END ASC,
            marks DESC

This might help you: 这可能对您有所帮助:

  SELECT *
    FROM results
ORDER BY SUBSTRING(qid FROM 1 FOR 9) ASC,
         marks DESC

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM