MySQL中LEFT JOIN的问题

时间:2010-12-03 17:10:08

标签: database mysql

我的MySQL查询有点问题。 我正在使用LEFT JOIN到table1和table2。但是table2中的许多行可以匹配table1中的一行。 我知道LEFT JOIN在找到一个匹配行时会停止搜索,但它似乎是随机执行的。即使我对table2进行排序,它也不会占用第一个匹配行。

你知道解决方案吗?

示例:

表1

date1      |
-----------
2010-10-10 |
2010-10-10 |
2010-10-10 |

表2

date2      | item
-------------------------
2010-10-09 | item1
2010-10-08 | item2
2010-10-07 | item3

SQL查询

SELECT * FROM table1 LEFT JOIN table2 ON date2<=date1

我希望

date1      | date2       | item
--------------------------------------
2010-10-10 | 2010-10-09  | item1
2010-10-10 | 2010-10-09  | item1
2010-10-10 | 2010-10-09  | item1

但我得到了f.e

date1      | date2       | item
--------------------------------------
2010-10-10 | 2010-10-09  | item1
2010-10-10 | 2010-10-08  | item2
2010-10-10 | 2010-10-09  | item1

2 个答案:

答案 0 :(得分:0)

  

我知道LEFT JOIN停止搜索   当它找到一个匹配行时

左连接根本不会这样做。它返回所有匹配的行。如果您有行为,则无法解释发布整个查询将有助于我们帮助您。

答案 1 :(得分:0)

您的示例数据不是很容易使用,因为table1上没有PK且您有重复项,因此无法使用GROUP BY

虽然我可能从未在实践中使用过这种方法,但这种方法似乎有效!

create table table1 (date1 DATE);

create table table2(date2 DATE, item varchar(10));

insert into table1
SELECT CAST('2010-10-10' AS DATE) AS date1 UNION ALL
SELECT CAST('2010-10-10' AS DATE) AS date1 UNION ALL
SELECT CAST('2010-10-10' AS DATE) AS date1;

insert into table2
SELECT CAST('2010-10-09' AS DATE) AS date2, 'item1' AS item  UNION ALL
SELECT CAST('2010-10-08' AS DATE) AS date2, 'item2' AS item  UNION ALL
SELECT CAST('2010-10-07' AS DATE) AS date2, 'item3' AS item;


SELECT 
      date1,
      cast(left(Top,10) as date) AS date2,
      cast(substring(Top,11) as char) AS item      
FROM
(
SELECT date1, 
      (SELECT CONCAT(date2,item) FROM table2 WHERE date2<=date1 ORDER BY date2 DESC LIMIT 1) AS Top
FROM table1
) t