我正在尝试实现连接,然后我可以根据另一个表的列来排序一个表的结果。当两个表中都存在记录时,我的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
。
答案 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排序。