web-dev-qa-db-fra.com

Requête MySQL pour commander deux colonnes, un ASC un autre DESC

Je suis en train de préparer une liste de sujets fondés sur le mérite. J'utilise ce mysql query:

SELECT * 
FROM results 
ORDER BY qid ASC,
    marks DESC

Le résultat est:

enter image description here

Mais ce dont j'ai besoin est comme ceci (regardez la colonne marks, je dois obtenir les mêmes rangées qid, ordonnées par marks):

enter image description here

S'il vous plaît, aidez-moi.

Mise à jour: Et il s’agit du fichier result.sql pour créer la table dans votre ordinateur.

-- 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 */;
12
Cool Brain

C'est exactement ce dont vous avez besoin:

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

Je n'ai pas bien compris votre question, mais en regardant le résultat, j'ai remarqué que les enregistrements sont triés par qid, qui contient EN en premier.

essayez ceci, 

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

Cela pourrait vous aider:

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