2009-05-01 11 views
3

は、私のテーブルの設定である:ここで選択によるmysqlの注文 - 可能ですか?ここ

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) 

は、私が何をしたいです:しかし、私は(BY ORDER SELECT * FROM」のような構文を使用したい

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) 

Bから選択しますORDER BY z)」を選択します。

これは可能ですか?

+2

だけを選択し、「使用に問題は何*、B a.idから。 = ba order by bz; "? – tpdi

+1

醜い古いスタイルの結合以外は、つまり。 – tpdi

答えて

1
SELECT * FROM a ORDER BY (SELECT a FROM b ORDER BY z) 

いいえ、これは何をしたいあなたを得ることはありません。最初に、副問合せは複数の行を戻すため、外部問合せのORDER BYの式として使用することはできません。

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

はまた、クエリのそのフォーム与えられ、aの行とサブクエリ内の行の順序の間には相関関係がありません:これは、あなたが得るエラーです。つまり、サブクエリ内の値をソートしても、外部クエリの行が一致する順序でソートされるわけではありません。

あなたは(複数の一致する行がbである場合でも)a場合は、行ごとに結果セットの1行だけ確保しようとしているなら、あなたはおそらくこれをしたい:

SELECT DISTINCT a.* 
FROM a JOIN b ON (a.id = b.a) 
ORDER BY b.z; 
6

はによってソートサブクエリが正確に1つの結果を返す限り、サブクエリは可能です。つまり、サブクエリ内のテーブルを結合する必要があります。

私はちょうどセットアップこの私のアプリケーション内のクエリビルダで、このような何かがあなたのために働く必要があります。

SELECT a.* 
FROM a,b 
WHERE a.id = b.a 
ORDER BY (
    SELECT z 
    FROM b 
    WHERE a.id = b.a 
) ASC 
関連する問題