SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.11.2011 23:42:59

mdweb
Участник
Зарегистрирован: 08.11.2011
Сообщений: 4

Сложный запрос. help

Есть таблица

id |  str  | ind
---------------
1  | str1 | 0
2  | str1 | 0
3  | str1 | 2
4  | str2 | 0
5  | str3 | 0
6  | str1 | 4

Нужно получить строки в одном запросе
1. Все строки, у которых str='str1' && ind=0
2. Строки, у которых str='str1' && ind>0, но при условии что этот ind равен строке с таким же id, у которой str!='str1'

То есть мне нужно получить следущее
Из первого условия:
1  | str1 | 0
2  | str1 | 0
Из второго условия:
6  | str1 | 4

Похоже что это не реально!? Может хоть идеи какие-нибудь есть? HELP

Неактивен

 

#2 09.11.2011 00:33:15

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Сложный запрос. help

"...но при условии что этот ind равен строке с таким же id"

ничего нет понял

Неактивен

 

#3 09.11.2011 00:51:14

mdweb
Участник
Зарегистрирован: 08.11.2011
Сообщений: 4

Re: Сложный запрос. help

Второе условие:
Мне нужна строка X,  у которой str='str1' && ind>0. НО при условии, что есть в таблице строка Y, у которой id будет равен ind строки X и при этом str строки Y != 'str1'

Неактивен

 

#4 09.11.2011 00:53:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сложный запрос. help

Оно?

select * from t_4920 t where t.str='str1' and ( (t.ind > 0 and exists(select * from t_4920 where id=t.ind and str<>'str1') ) or t.ind=0  );


Код:

mysql> create table t_4920(id int, str varchar(80), ind int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_4920 values(1,'str1',0),(2,'str1',0),(3,'str1',2),(4,'str2',0),(5,'str3',0),(6,'str1',4);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_4920 t where t.str='str1' and ( (t.ind > 0 and exists(select * from t_4920 where id=t.ind and str<>'str1') ) or t.ind=0  );
+------+------+------+
| id   | str  | ind  |
+------+------+------+
|    1 | str1 |    0 |
|    2 | str1 |    0 |
|    6 | str1 |    4 |
+------+------+------+
3 rows in set (0.00 sec)

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 09.11.2011 01:27:18

mdweb
Участник
Зарегистрирован: 08.11.2011
Сообщений: 4

Re: Сложный запрос. help

deadka написал:

Оно?

Буду пробовать. Надеюсь что оно. Спасибо за помощь

А можно еще усложнить запрос таким условием:

есть в базе еще строки
7 | str1 | 4
8 | str1 | 4

Но мне нужно только первую попавшуюся, т.е. c id=6, а 7 и 8 пропустить?
Такое возможно?

Неактивен

 

#6 09.11.2011 01:35:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сложный запрос. help

Усложнение возможно, если с limit поиграться:


select * from t_4920 t where t.str='str1' and (t.ind > 0 and exists(select * from t_4920 where id=t.ind and str<>'str1') ) limit 1 union
(select * from t_4920 t where t.str='str1' and t.ind=0);
 

Отредактированно deadka (09.11.2011 02:10:24)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 09.11.2011 11:17:25

mdweb
Участник
Зарегистрирован: 08.11.2011
Сообщений: 4

Re: Сложный запрос. help

Спасибо

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson