2014-10-13 3 views
-1

Мне нужно выбрать данные из одной таблицы, но в два этапа. Я попытался использовать IN() для этого:Как оптимизировать запрос?

SELECT * FROM my_table WHERE CONCAT(field1,'|',field2) IN 
    (
      SELECT CONCAT(field1,'|',field2) 
      FROM my_table WHERE field3=12345 AND field4=0 
    ) 

Но он работает очень медленно. Как правильно его реализовать?

Обновление: во-первых, мне нужно выбрать из my_table все строки, которые удовлетворяют условию 'field3 = 12345 AND field4 = 0'. Во-вторых, мне нужно выбрать все строки с одинаковыми полями1 и поле2.

+2

Является '' field3' и field4' индексной? Нормализованы ли ваши данные? Удалить подзапрос и присоединиться к таблицам? –

+2

Предполагаю, что вы заменили свое реальное имя таблицы на 'my_table'. Вы действительно используете одну и ту же таблицу в инструкции from и во вложенном элементе? Потому что ... все, что не нужно, то. Если бы они были двумя разными таблицами, я мог бы понять. –

+4

Почему вы делаете эту операцию 'CONCAT' на Земле? Я что-то упускаю, или это будет возвращать те же результаты, что: 'SELECT * FROM my_table WHERE field3 = 12345 AND field4 = 0'? – David

ответ

1

Вы можете иметь несколько условий в РЕГИСТРИРУЙТЕСЬ так:

SELECT * 
FROM my_table mt 
JOIN 
    (
      SELECT DISTINCT field1,,field2 
      FROM my_table WHERE field3=12345 AND field4=0 
    ) AS q 
ON mt.field1 = q.field1 AND mt.field2 = q.field2; 

подзапрос нуждается DISTINCT поэтому мы не будем иметь двойников в результате.

1

с человеком например ...

create table person (
    person_id int primary key, 
    person_name varchar(20), 
    person_hair varchar(20) 
); 

insert into person values (1,'bob','brown'); 
insert into person values (2,'jim','brown'); 
insert into person values (3,'travis','blonde'); 
insert into person values (4,'ron','red'); 

mysql> select * from person where person_name='bob' and person_hair='brown'; 
+-----------+-------------+-------------+ 
| person_id | person_name | person_hair | 
+-----------+-------------+-------------+ 
|   1 | bob   | brown  | 
+-----------+-------------+-------------+ 
1 row in set (0.00 sec) 

mysql> select * from person where person_name='bob' or person_hair='brown'; 
+-----------+-------------+-------------+ 
| person_id | person_name | person_hair | 
+-----------+-------------+-------------+ 
|   1 | bob   | brown  | 
|   2 | jim   | brown  | 
+-----------+-------------+-------------+ 
2 rows in set (0.00 sec) 

mysql> select * 
    -> from  person as p1 
    -> where p1.person_hair in (select person_hair 
    ->        from person 
    ->        where person_name='bob'); 
+-----------+-------------+-------------+ 
| person_id | person_name | person_hair | 
+-----------+-------------+-------------+ 
|   1 | bob   | brown  | 
|   2 | jim   | brown  | 
+-----------+-------------+-------------+ 
2 rows in set (0.03 sec) 
+1

Вы правы. Когда мы ищем по 1 параметру (например, цвет волос), нам просто нужно использовать оператор IN(). Но когда здесь есть 2 параметра или больше ... – BArtWell

+0

два параметра или два значения возврата –

+0

(я знаю, что у вас уже есть ваш ответ, но я уже набрал его. Я все еще не уверен, что даже полностью понимаю ситуацию. .. и вы действительно должны попытаться не присоединяться к строковым полям. используйте ID, если можете) –

Смежные вопросы