MySQL заказ по выбору - возможно? - PullRequest
3 голосов
/ 02 мая 2009

Вот мои настройки таблицы:

mysql> describe a;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment | 
| x     | int(11)    | YES  |     | NULL    |                | 
| y     | varchar(1) | YES  |     | NULL    |                | 
+-------+------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> describe b;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment | 
| a     | int(11)    | NO   |     | NULL    |                | 
| z     | varchar(1) | YES  |     | NULL    |                | 
+-------+------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> select * from a;
+----+------+------+
| id | x    | y    |
+----+------+------+
|  1 |    1 | a    | 
|  2 |    2 | b    | 
|  3 |    3 | c    | 
|  4 |    4 | d    | 
+----+------+------+
4 rows in set (0.01 sec)

mysql> select * from b;
+----+---+------+
| id | a | z    |
+----+---+------+
|  1 | 3 | q    | 
|  2 | 2 | a    | 
|  3 | 1 | u    | 
|  4 | 4 | x    | 
+----+---+------+
4 rows in set (0.01 sec)

Вот что я хочу сделать:

mysql> select a.* from a, b where a.id = b.a order by b.z;
+----+------+------+
| id | x    | y    |
+----+------+------+
|  2 |    2 | b    | 
|  3 |    3 | c    | 
|  1 |    1 | a    | 
|  4 |    4 | d    | 
+----+------+------+
4 rows in set (0.00 sec)

Однако я хочу использовать синтаксис, такой как «SELECT * FROM ORDER BY (ВЫБРАТЬ ИЗ b ORDER BY z)».

Возможно ли это?

Ответы [ 3 ]

8 голосов
/ 08 февраля 2012

Сортировка по подзапросу возможна, если подзапрос возвращает ровно 1 результат, что означает, что вам нужно объединить таблицы в подзапросе.

Я просто настроил это в построителе запросов в моем приложении, что-то вроде этого должно работать для вас:

SELECT a.*
FROM a,b
WHERE a.id = b.a
ORDER BY (
   SELECT z
   FROM b
   WHERE a.id = b.a
) ASC
2 голосов
/ 02 мая 2009
SELECT * FROM a ORDER BY (SELECT a FROM b ORDER BY z)

Нет, это не даст вам того, что вы хотите. Во-первых, подзапрос возвращает более одной строки, поэтому его нельзя использовать в качестве выражения в ORDER BY внешнего запроса. Это ошибка, которую вы получаете:

ERROR 1242 (21000): Subquery returns more than 1 row

Кроме того, нет никакой корреляции между строками a и порядком строк в подзапросе, учитывая эту форму запроса. Другими словами, даже если вы отсортировали значения в подзапросе, это не приводит к сортировке строк внешнего запроса в соответствующем порядке.

Если вы пытаетесь обеспечить только одну строку в наборе результатов на строку, если a (даже если в b есть несколько совпадающих строк), вам, вероятно, понадобится:

SELECT DISTINCT a.* 
FROM a JOIN b ON (a.id = b.a)
ORDER BY b.z;
2 голосов
/ 02 мая 2009

Я действительно не думаю, что это возможно так, как вы это описываете, я думаю, что вам нужно будет присоединиться к столам.

Посмотрите на это: http://www.w3schools.com/Sql/sql_join_inner.asp

...