Выберите строку на основе другой строки с таким же идентификатором в той же таблице в MySQL

У меня есть представление таблицы 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, но ничего не добились. Пожалуйста помоги. Спасибо.

Вам действительно следует избегать повторяющихся значений для «id», так как, по крайней мере, когда я вижу столбец id, я предполагаю, что это первичный ключ.

Shardj 28.05.2019 13:15

Извините, забыл упомянуть, это на просмотре.

John Miller 28.05.2019 13:16

Это имеет больше смысла. Ну, вы могли бы легко сделать это с помощью внутреннего соединения, левое соединение, как вы узнали, не будет работать.

Shardj 28.05.2019 13:17

Обратите внимание, что запросы к представлениям в MySQL не могут использовать индексы, что делает их (на мой взгляд) практически бесполезными.

Strawberry 28.05.2019 13:21

Я знаю, что они не используют индексы. Какой бы ответ я ни получил, я попробую его на основных столах.

John Miller 28.05.2019 13:29
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужны СУЩЕСТВУЮЩИЕ:

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 полей. Спасибо.

John Miller 28.05.2019 13:49

EXISTS обычно является наиболее эффективным способом в таких случаях.

forpas 28.05.2019 13:50

Кстати, как бы вы добавили дополнительное условие, скажем, «где C3=1?» Должен ли он располагаться в основном тексте или внутри предложения exists?

John Miller 28.05.2019 13:53

Зависит от логики условия: если это что-то вроде случая c1 = 'A5', то поместите его внутри EXISTS.

forpas 28.05.2019 13:54

Вы можете использовать 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');

Другие вопросы по теме