У меня есть представление таблицы T, например:
id | C1 | C2 |
---+------+-----+
1 | pat | 190 |
1 | pat1 | 191 |
1 | A5 | 302 |
2 | pet | 190 |
2 | pet1 | 191 |
2 | A5 | 302 |
3 | pit | 190 |
3 | pit1 | 191 |
3 | A6 | 302 |
Хотел бы получить:
id | C1 | C2 |
---+------+-----+
1 | pat | 190 |
2 | pet | 190 |
Другими словами, верните идентификатор, где C2 = 190, где тот же идентификатор в другом месте таблицы равен A5.
Пробовали несколько подходов LEFT JOIN, но ничего не добились. Пожалуйста помоги. Спасибо.
Извините, забыл упомянуть, это на просмотре.
Это имеет больше смысла. Ну, вы могли бы легко сделать это с помощью внутреннего соединения, левое соединение, как вы узнали, не будет работать.
Обратите внимание, что запросы к представлениям в MySQL не могут использовать индексы, что делает их (на мой взгляд) практически бесполезными.
Я знаю, что они не используют индексы. Какой бы ответ я ни получил, я попробую его на основных столах.
Вам нужны СУЩЕСТВУЮЩИЕ:
select t.*
from tablename t
where c2 = 190
and exists (
select 1 from tablename where id = t.id and c1 = 'A5'
)
Смотрите демо.
Результаты:
| id | C1 | C2 |
| --- | --- | --- |
| 1 | pat | 190 |
| 2 | pet | 190 |
Работал отлично и быстро на представлении с более чем 50 тыс. строк и более 80 полей. Спасибо.
EXISTS обычно является наиболее эффективным способом в таких случаях.
Кстати, как бы вы добавили дополнительное условие, скажем, «где C3=1?» Должен ли он располагаться в основном тексте или внутри предложения exists?
Зависит от логики условия: если это что-то вроде случая c1 = 'A5', то поместите его внутри EXISTS.
Вы можете использовать EXISTS
, чтобы проверить, существует ли строка с c1 = 'A5'
для идентификатора.
SELECT *
FROM t t1
WHERE t1.c2 = 190
AND EXISTS (SELECT *
FROM t t2
WHERE t2.id = t1.id
AND t2.c1 = 'A5');
Вам действительно следует избегать повторяющихся значений для «id», так как, по крайней мере, когда я вижу столбец id, я предполагаю, что это первичный ключ.