Объединение SQL с использованием столбца псевдонимов «на лету»

#mysql #sql #join #left-join #alias

#mysql #sql #Присоединиться #соединение слева #псевдоним

Вопрос:

У меня есть несколько таблиц с отношением «один ко многим», и мне нужно присоединить самую последнюю к родительской.

Проблема, с которой я сталкиваюсь, заключается в том, что дата хранится в виде 3 столбцов: день, месяц, год. Это связано с тем, что день является необязательным полем, если пользователь не знает точной даты.

Чтобы получить полную дату в виде одного столбца, я делаю это в инструкции SELECT, но MySQL говорит мне, что я не могу использовать эти столбцы псевдонимов «на лету» в предложении ON для моих объединений.

 SELECT
    restaurants.*,
    locations.name AS location,
    files.filename AS flag,
    CONCAT(p1.open_year,'-',p1.open_month,'-',COALESCE(NULLIF(p1.open_day,''), '30')) AS open_date,
    CONCAT(p2.open_year,'-',p2.open_month,'-',COALESCE(NULLIF(p2.open_day,''), '30')) AS p2_open_date
FROM restaurants
    LEFT JOIN locations ON restaurants.location_id = locations.id
    LEFT JOIN files ON locations.flag_id = files.id
    LEFT JOIN projects p1 ON (restaurants.id = p1.restaurant_id)
    LEFT OUTER JOIN projects p2 ON (restaurants.id = p2.restaurant_id AND 
(open_date < p2_open_date OR open_date = p2_open_date AND p1.id < p2.id))
WHERE restaurants.$by = :search
GROUP BY restaurants.id
  

Как мне получить самую последнюю строку на основе даты из 3 столбцов?

Комментарии:

1. Рассматривали ли вы возможность сохранения даты как a DATE ?

Ответ №1:

Можете ли вы сделать CONCAT , когда вы определяете p1 скорее?

 LEFT JOIN (SELECT
           --attributes you need from projects... 
           CONCAT(p1.open_year,'-',p1.open_month,'-',COALESCE(NULLIF(p1.open_day,''), '30')) AS open_date 
           FROM projects) p1 ON (restaurants.id = p1.restaurant_id)
  

Комментарии:

1. Мне удалось это исправить, но я сделал это немного по-другому, но в основном это была та же идея. Я сделал CONCAT это в соединении, и это сработало!

2. @Adam ты имеешь в виду внутри ON предложения?