Объединение двух таблиц в соответствии со значением столбца, указанным в родительской таблице

#mysql

#mysql

Вопрос:

Моя главная таблица — это таблица «ordered_product».

Я хочу присоединиться к другой таблице в соответствии со значением, находящимся в столбце «product_id_type» внутри нее.

Если мой «product_type_id» = 1, я хочу присоединиться к таблице «allopathy_medicine». Если это 2, я хочу присоединиться к таблице «ayurveda_medicine».

Если «product_type_id» в таблице «ordered_product» равно 1, это означает, что я могу разрешить получать название продукта только из таблицы «allopathy_medicine».

Основная цель состоит в том, чтобы показать названия продуктов на странице. введите описание изображения здесь

 SELECT ordered_product.*,
    CASE
WHEN product_type_id = 1 THEN allopathy_medicine.name AS allopathyName
WHEN product_type_id = 2 THEN ayurvada - medicine.name AS ayurvedaName
ELSE allopathy_medicine.name
END
FROM ordered_product
INNER JOIN allopathy_medicine ON allopathy_medicine.id = ordered_product.product_id
INNER JOIN ayurvada - medicine ON ayurvada_medicine.id = ordered_product.product_id
 

Приведенный выше код — это мой код, но он не работает, он показывает синтаксическую ошибку в php my admin. Я с нетерпением жду ответов.

Спасибо тебе, шиной

обновление: я обнаружил, что этот код работает на основе ответов, кто-нибудь знает, как уменьшить код:

 SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    al.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN allopathy_medicine al ON al.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 1 AND op.order_no = orderNo //passed externaly
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `ayurvada-medicine` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 2 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `veterinary_medicine` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 3 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `fitness` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 4 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `cosmetic` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 5 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `sugical_products` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 6 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `laboratory_products` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 7 AND op.order_no = orderNo
UNION ALL
SELECT
    op.order_no,
    op.product_type_id,
    op.qty,
    op.amount,
    ay.name,
    pt.name AS pdttype
FROM ordered_product op
JOIN `animal_food` ay ON ay.id = op.product_id
JOIN product_type pt ON pt.id = op.product_type_id
WHERE op.product_type_id = 8 AND op.order_no = orderNo
 

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

1. Имейте в виду, что включение математических операторов в идентификаторы таблиц / столбцов — катастрофически плохая идея.

Ответ №1:

Не может быть проще, чем это.

 SELECT
    op.product_id,
    op.product_type_id,
    IFNULL(al.name, ay.name) AS name
FROM ordered_product op
LEFT JOIN allopathy_medicine al ON al.id = op.product_id AND product_type_id = 1
LEFT JOIN ayurveda_medicine ay ON ay.id = op.product_id AND product_type_id = 2
 

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

1. У меня есть 8 product_type_id для проверки, поэтому код будет больше, любой более короткий метод?

2. 8 product_type_id , что означает, что у вас есть 8 таблиц (включая allopathy_medicine и ayurveda_medicine ) ? Я сомневаюсь, что это может стать короче. Я имею в виду, что это уже короче, чем выполнение UNION

3. Хорошо, вы обновили ответ . хорошо. Но предыдущий код работает нормально . Новый код не работает.

Ответ №2:

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

 SELECT op.*, COALESCE(alm.name, aym.name) AS medicine_name,
       CASE WHEN aym.id IS NULL THEN 'allopathy' ELSE 'ayurvada' END AS medicine_type
FROM ordered_product op
LEFT JOIN allopathy_medicine alm ON alm.id = op.product_id
LEFT JOIN `ayurvada-medicine` aym ON aym.id = op.product_id;
 

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

1. В моем случае product_id не является уникальным, тот же идентификатор находится внутри allopathy_medicine, а также ayurveda_medicine . Приведенный выше код работает . Но мой product_id не является уникальным каким-либо другим способом?

2. Хорошо, если продукт id соответствует обеим таблицам лекарств, что вы хотите отобразить?

3. Вот почему я добавил product_type_id в таблицу ordered_product . С помощью этого я могу различать, не так ли? или, по-вашему, я готов реализовать уникальное ограничение в поле «id» таблицы allopathy_medicine и таблицы ayurveda_medicine, как я могу реализовать?

4. Ваши комментарии и код противоречат друг другу. Отредактируйте свой вопрос и добавьте примеры данных, а затем покажите нам желаемый результат.

5. Хорошо, спасибо за вашу поддержку, и я скоро обновлю этот вопрос.

Ответ №3:

Один тип продукта может быть или типа 1 или типа 2, так что ваше внутреннее соединение никогда не завершается неудачно

Если строка не всегда совпадает, вам следует использовать соединение по левому краю

 SELECT ordered_product.*,
    CASE
WHEN product_type_id = 1 THEN allopathy_medicine.name 
WHEN product_type_id = 2 THENm2.name 
ELSE allopathy_medicine.name
END  medicine_name
FROM ordered_product
LEFT  JOIN allopathy_medicine ON allopathy_medicine.id = ordered_product.product_id
LEFT  JOIN `ayurvada - medicine` m2 ON m2.id = ordered_product.product_id
 

и вы не должны использовать tablename со знаком минус .. вы должны использовать подчеркивание .. но если ваш shce содержит этот символ, вы должны обернуть имя таблицы обратными знаками

и вы можете назначить другой псевдоним имени столбца внутри условия case when, но только один общий псевдоним имени столбца после end

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

1. Это не работает в моем mysql. показывает синтаксическую ошибку

2. обновлен ответ удалено другое имя столбца псевдоним внутри случая, когда потому что не разрешено