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

0

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

Вы знаете, может быть, решение?

Пример:

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
  • 1
    «Я знаю, что LEFT JOIN прекращает поиск, когда находит одну строку совпадения, но, похоже, делает это случайно». Это неправильно. Вы используете GROUP BY ? Это может объяснить недетерминированный результат в MySQL. Каков ваш точный запрос?
  • 2
    Разместите свой запрос и ожидаемый результат. Также предоставьте некоторые образцы данных.
Показать ещё 5 комментариев
Теги:
database

2 ответа

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
0

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

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

  • 0
    Я отредактировал свой вопрос. Может быть, теперь будет понятнее

Ещё вопросы

Сообщество Overcoder
Наверх
Меню