SELECT
a.price as price1
, IFNULL(b.price,'(no data)') as price2
, (a.price - IFNULL(b.price,0)) as difference
FROM table1 a
LEFT JOIN table2 b ON (a.`item name` = b.`item name`)
GROUP BY a.`item name`
HAVING IFNULL(b.`date`,'') = MAX(IFNULL(b.`date`,'')
Вот как это работает.
Выбирает данные из 2 таблиц: все данные из таблицы1 и соответствующие данные из таблицы2.
Если он не может найти совпадающие данные из таблицы 2, он заменит пропущенные строки null
значениями. (left join
)
Затем он группирует (group by
) строк вместе на основе table1.item name
.
Это объединяет несколько строк на элемент.
Предложение having
исправляет это, выбирая только самые новые строки даты из таблицы 2.
В предложения select
и having
встроена небольшая поправка для случая, когда в таблице 2 нет данных, соответствующих таблице 1.
Ваш запрос должен быть:
SELECT
s.closing as price1
, IFNULL(sh.closing,'(no data)') as price2
, (s.closing - IFNULL(sh.closing,0)) as difference
FROM stocks s
LEFT JOIN stockhistory sh ON (s.symbol = sh.symbol)
GROUP BY s.symbol
HAVING IFNULL(sh.edate,'') = MAX(IFNULL(sh.edate,'')
LIMIT 30 OFFSET 0;