#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. обновлен ответ удалено другое имя столбца псевдоним внутри случая, когда потому что не разрешено