我的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
答案 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