Проблемы с LEFT JOIN в MySQL - PullRequest
       2

Проблемы с LEFT JOIN в MySQL

0 голосов
/ 03 декабря 2010

У меня небольшая проблема с моим запросом MySQL. Я использую LEFT JOIN для table1 и table2. Но многие строки в таблице2 могут соответствовать одной строке в таблице1. Я знаю, что LEFT JOIN прекращает поиск, когда находит одну строку совпадения, но, похоже, делает это случайно Даже когда я сортирую table2, он не занимает первую строку соответствия.

Знаете ли вы, может быть, решение?

Пример:

table1

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

table2

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 голосов
/ 03 декабря 2010

С вашими примерами данных не очень легко работать, так как на 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
0 голосов
/ 03 декабря 2010

Я знаю, что осталось присоединиться когда он находит одну строку совпадений

Левое объединение не делает этого вообще. Возвращает все совпадающие строки. Если у вас есть поведение, которое вы не можете объяснить, размещение всего запроса поможет нам помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...