У меня есть таблица с некоторыми данными
t1
------------------
id (int)
item_id (int)
item_description (text)
showHide (enum 0,1)
Обычно я показываю любые результаты, для которых флаг showHide установлен на '0'. Мне нужно изменить запрос, чтобы также показать результаты с флагом showHide, установленным в '1', если пользователь имеет соответствующий item_id в другой таблице, t2.
t2
------------------
id (int)
item_id (int)
usr_id (int)
Застрял здесь, не уверен, как это сделать:
SELECT item_description FROM t1
// get results with showHide = 0
// AND
// showHide = 1 if t1.item_id found in t2 WHERE usr_id = 123
SELECT
t1.item_description
FROM
t1
LEFT JOIN (
SELECT item_id FROM t2 WHERE usr_id = 123
) AS t2
USING (item_id)
WHERE
t1.showHide = 0
OR
(t1.showHide = 1 AND t2.item_id IS NOT NULL)
Просто объедините 2 запроса с помощью UNION
SELECT t1.item_description
FROM t1
WHERE showHide = 0
UNION
SELECT t1.item_description
FROM t1
INNER JOIN t2 ON t1.item_id = t2.item_id
WHERE showHide = 1
Чем сложнее, тем менее результативнее:
SELECT t1.item_description
FROM t1
LEFT JOIN t2 ON t1.item_id = t2.item_id
WHERE showHide = 0
OR (showHide = 1 AND t2.item_id IS NOT NULL)
LEFT JOIN
(который медленнее, чем INNER JOIN
2) OR
с полем 0/1 (так как mysql не имеет индексов растрового типа) вообще не будет оптимизирован (будет fullscan в любом слючае).
join
сON
может значительно снизить производительность.