2010-04-07 9 views

Répondre

1

Prenez l'union de Combiner en quelque sorte (a) celui du haut, le tri croissant, (b) les deux premiers, le tri décroissant.

+1

Vous ne pouvez pas union avec différentes sortes. –

+0

Merci! Je vais éditer. – John

3

Je ne pense pas que vous pouvez le faire avec une seule requête: Je dirais que vous devez utiliser deux requêtes:

One, pour obtenir le premier résultat:

select * 
from your_table 
order by id asc 
limit 1 


et un autre pour obtenir les deux derniers résultats - le tri dans le sens inverse et d'obtenir les deux premiers on va faire l'affaire:

select * 
from your_table 
order by id desc 
limit 2 


Après cela, au lieu de faire deux demandes de votre langage de programmation au serveur SQL, vous pouvez envoyer une seule requête, qui utiliserait une union pour obtenir les résultats des deux:

(select * from your_table order by id asc limit 1) 
UNION 
(select * from your_table order by id desc limit 2) 

Mais, penser ... pas sûr que cela est effectivement possible, avoir une union avec l'ordre par les limites et dans chaque sous-requête ...



EDIT: Je l'ai fait la test, et il est semble qu'il est possible:

Voici les deux requêtes, exécutées indépendamment:

mysql> select id, title from post order by id asc limit 1; 
+----+--------------+ 
| id | title  | 
+----+--------------+ 
| 1 | Premier post | 
+----+--------------+ 
1 row in set (0,00 sec) 

mysql> select id, title from post order by id desc limit 2; 
+----+-------------------------+ 
| id | title     | 
+----+-------------------------+ 
| 7 | Septième post   | 
| 6 | Sixième post (draft=7) | 
+----+-------------------------+ 
2 rows in set (0,00 sec) 

Et voici à quoi il ressemble avec l'UNION:

mysql> (select id, title from post order by id asc limit 1) UNION (select id, title from post order by id desc limit 2);                                      
+----+-------------------------+ 
| id | title     | 
+----+-------------------------+ 
| 1 | Premier post   | 
| 7 | Septième post   | 
| 6 | Sixième post (draft=7) | 
+----+-------------------------+ 
3 rows in set (0,03 sec) 

Notez, cependant, que l'ordre des 3 lignes résultantes n'est pas très bien défini ...


Et, en citant la page de manuel suivante de MySQL 5.1: 12.2.8.3. UNION Syntax:

Pour appliquer ORDER BY ou LIMIT à un individuel SELECT, placez la clause dans les parenthèses qui enferment SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 

Cependant, l'utilisation de ORDER BY pour les instructions SELECT individuelles n'impliquent rien dans l'ordre dans lequel les lignes apparaissent dans le résultat final car UNION produit par défaut un ensemble de lignes non ordonnées .

0

Dans deux requêtes:

select * from table order by id asc limit 1 
select * from table order by id desc limit 2 

Je ne sais pas si vous pouvez le faire en 2 requêtes dans une base MySQL. Vous pouvez le faire de cette façon en ms-sql:

select * from table order by id asc limit 1 
union all 
select * from table order by id desc limit 2 
0

Eh bien, ce n'est pas assez de le faire dans une requête (en particulier depuis MySQL doesn't support LIMIT in IN subqueries), mais il est possible (mais les sous-requêtes sont une sorte de tricherie):

SELECT id, name 
FROM table 
WHERE id = (SELECT id FROM table ORDER BY id LIMIT 1) 
    OR id = (SELECT id FROM table ORDER BY id DESC LIMIT 1) 
    OR id = (SELECT id FROM table ORDER BY id DESC LIMIT 1,1) 
Questions connexes