使用MySQL根据另一个表的顺序排序一个表

时间:2015-04-01 16:10:21

标签: php mysql sql mysqli

我正在尝试实现连接,然后我可以根据另一个表的列来排序一个表的结果。当两个表中都存在记录时,我的SQL工作正常。当table1中的记录多于table2中的记录时,SQL也可以工作,前提是我不使用ORDER BY子句。

SQL:

SELECT * FROM table1 
 JOIN table2 b ON table1.col1 = b.col1 
 WHERE col3 != 0 ORDER BY b.col2 ASC;

表1

col1 | col2 | col3
__________________
1      foo    1
2      foo    1
5      foo    1
9      foo    0
10     foo    1
17     foo    0
14     foo    1
12     foo    1

表2

col1 | col2
___________
1       a
2       b
17      e
14      g
12      l

当两个表之间的记录不匹配时,查询ORDER BY b.col2 ASC的部分导致它失败。

我不能保证两者都有记录。有没有办法实现这个?

我目前正在使用mysqli,但如果需要,可以使用pdo

2 个答案:

答案 0 :(得分:0)

如同提到的@ Maximus2012,请尝试LEFT JOIN。这将为您提供table1中的所有记录以及table2中与table1中的col1匹配的任何记录。

SELECT * FROM table1 
LEFT JOIN table2 b ON table1.col1 = b.col1 
WHERE col3 != 0 ORDER BY b.col2 ASC

如果您要查找table2中的所有记录以及表1中的任何匹配项,请改用RIGHT JOIN

SELECT * FROM table1 
RIGHT JOIN table2 b ON table1.col1 = b.col1 
WHERE col3 != 0 ORDER BY b.col2 ASC

答案 1 :(得分:0)

使用LEFT JOIN来获取此查询:

SELECT table1.*, 
table2.col2,
CASE WHEN table2.col2 IS NOT NULL THEN '0' 
ELSE '1' END AS derived_column FROM table1 
LEFT JOIN table2 ON table1.col1 = table2.col1 
WHERE table1.col3 <> 0 
ORDER BY derived_column, table2.col2

查看上述查询是否适用于您的案例。它有点复杂,因为原始查询中的ORDER BY子句会将匹配的列之前的非匹配列放在结果中。为了绕过这个,我有条件地创建了一个派生列,返回值0(用于匹配)和1(用于非匹配)。然后,您首先按此派生列排序(值为0的行将位于值为1的行之前),然后按table2.col2排序。