MySQL запрос - условный выбор

0

У меня есть таблица с некоторыми данными

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
Теги:

2 ответа

1
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)
  • 0
    Вложенный выбор вместо обычного join с ON может значительно снизить производительность.
  • 0
    Это некоррелированный подзапрос. Если вы не работаете на MySQL 4.x, он работает нормально.
Показать ещё 4 комментария
1

Просто объедините 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)
  • 1
    Я не понимаю, как «более хитрый» означает «менее производительный». Я не утверждаю, что второе решение может работать хуже (не до тех пор, пока оно не сравнится), просто не вижу связи между «хитростью» (субъективный термин, если не сказать больше) и производительностью.
  • 0
    @Mchl: он менее производительный, потому что: 1) LEFT JOIN (который медленнее, чем INNER JOIN 2) OR с полем 0/1 (так как mysql не имеет индексов растрового типа) вообще не будет оптимизирован (будет fullscan в любом слючае).
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню