2010-12-03 78 views
0

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

你知道也许有解决办法吗?

实施例:

表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 

,但我发现FE

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

“我知道LEFT JOIN在找到一个匹配行时停止搜索,但它似乎随机执行此操作”这是不正确的。你在使用“GROUP BY”吗?这可能解释MySQL中的不确定结果什么是您的确切查询? – 2010-12-03 17:12:30

+2

发布您的查询和预期输出。还提供一些示例数据。 – RedFilter 2010-12-03 17:14:29

回答

0

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

左连接完全不这样做。它返回所有匹配的行。如果你有行为,你不能解释发布整个查询将帮助我们帮助你。

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