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

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

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

Вы не зашли.

#1 09.04.2010 18:20:43

vladimirok5959
Участник
Зарегистрирован: 09.04.2010
Сообщений: 3

Как сделать сложный запрос

Здравствуйте, нужно сделать сложный запрос с одной таблице если это реально. Дело в том что это нужно сделать одним запросом.

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

id | User | Friend | Confirmed
1 | 1 | 2 | yes
1 | 2 | 1 | yes
1 | 1 | 3 | yes
1 | 3 | 1 | yes
1 | 1 | 4 | yes
1 | 4 | 1 | no


Нужно одним запросом получить следующий результат:
id | User | Friend | Confirmed
1 | 1 | 2 | yes
1 | 1 | 3 | yes

Строку:
1 | 1 | 4 | yes

не нужно так как присутствует строка:
1 | 4 | 1 | no

тоесть Confirmed = 'no'.

Большое спасибо за решение, если это возможно.

Неактивен

 

#2 09.04.2010 18:45:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как сделать сложный запрос

SELECT * FROM `Friends` WHERE User=1 GROUP BY Friend HAVING sum(if(Confirmed='yes',1,0))=2;


UPD: Вместо count нужно sum

Неактивен

 

#3 12.04.2010 00:30:32

vladimirok5959
Участник
Зарегистрирован: 09.04.2010
Сообщений: 3

Re: Как сделать сложный запрос

К сожалению это ничего не дало, выводит 0 строк. Это все равно если бы вы написали бы:

Вы писали:
SELECT * FROM `Friends` WHERE User=1 GROUP BY Friend HAVING sum(if(Confirmed='yes',1,0))=2;

Что будет:
SELECT * FROM `Friends` WHERE User=1 GROUP BY Friend HAVING sum(True)=2;

1 никогда не будет ровно 2;

Может вы меня не так поняли. Нужно сделать:

№1. SELECT * FROM `Friends` WHERE `User`=1 and `Confirmed`='yes';

но при втором условие, что в этой же таблице присутствует строка:
№2. SELECT * FROM `Friends` WHERE User=(значение из рядка №1 переменной Friend) and `Friend`=1 and `Confirmed`='yes';

Тоесть как бы два запроса в одном. Большое спасибо!

Отредактированно vladimirok5959 (12.04.2010 00:32:31)

Неактивен

 

#4 12.04.2010 01:40:49

vladimirok5959
Участник
Зарегистрирован: 09.04.2010
Сообщений: 3

Re: Как сделать сложный запрос

Короче всем спасибо, немножко погуглив, через 1 час эксперементов у меня все вышло, а именно мне нужно было сделать следующее:

SELECT
      *
FROM
      (SELECT * FROM `Friends`) AS _query1,
      (SELECT * FROM `Friends`) AS _query2
WHERE
      _query1.User=_query2.Friend and
      _query1.Friend=_query2.User and
      _query1.Confirmed='yes' and
      _query2.Confirmed='yes' and
      _query1.User=1;

Просто я еще не знал что можно использовать запросы в запросах smile. А вообще круто делать выборку в выборке smile

Тему можно закрывать.

Неактивен

 

#5 12.04.2010 01:54:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как сделать сложный запрос

vladimirok5959 написал:

а именно мне нужно было сделать следующее:

SELECT
      *
FROM
      (SELECT * FROM `Friends`) AS _query1,
      (SELECT * FROM `Friends`) AS _query2
WHERE
      _query1.User=_query2.Friend and
      _query1.Friend=_query2.User and
      _query1.Confirmed='yes' and
      _query2.Confirmed='yes' and
      _query1.User=1;

Так будет короче и, возможно, быстрее:

SELECT * FROM
     `Friends` AS _query1,
      `Friends` AS _query2
WHERE
      _query1.User=_query2.Friend and
      _query1.Friend=_query2.User and
      _query1.Confirmed='yes' and
      _query2.Confirmed='yes' and
      _query1.User=1;

Неактивен

 

Board footer

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