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

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

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

Вы не зашли.

#1 09.12.2011 21:38:59

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

объеденение двух запросов

данные таблицы favorit:
                      id_user1     id_user2    
строка 1          307                 291   
строка 2          291                 307

есть два запроса, которые работают правильно, первый выводит одно значение по строке 1, второй по строке 2

$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

нужно сделать третий запрос, который объеденит две строки и выведет одно значение, т.е. id_user1 = 307 and id_user2 = 307 and id_user1 = 291 and id_user2 = 291

я пытался написать так
$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]' and users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

ничего не выходит, помогите правильно написать

Неактивен

 

#2 10.12.2011 00:54:59

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

Re: объеденение двух запросов

А что значит "ничего не выходит"? Ошибку запрос возвращает или что?

>нужно сделать третий запрос, который объеденит две строки и выведет одно значение, т.е. id_user1 = 307 and id_user2 = >307 and id_user1 = 291 and id_user2 = 291

Так у Вас же нет таких строк в таблице.


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

Неактивен

 

#3 10.12.2011 01:18:22

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

deadka написал:

Так у Вас же нет таких строк в таблице.

каких таких? прочитайте внимательнне, может вы не поняли суть вопроса. может я не правильно его задалsmile

я тоже не пойму почему не получаеться, как бы должно smile
вот этот запрос должен выводить одно значение, исходя из данных таблицы, а не выводит ничего

$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]' and users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

где users.id = 307 и $myrow[id] = 291

данные таблицы favorit:
                      id_user1     id_user2     
строка 1          307                 291   
строка 2          291                 307

я не умею такие запросы писать, нужно короче не по одной строчке выбрать, а по двум, если есть такое совпадение в таблице как сейчас... и вывести одно значение из тыблицы users

попробую другими словами, т.е. нужно вытащить одного пользователя из таблицы users, где есть совпадения по двум строчкам как в таблице favorit

Неактивен

 

#4 10.12.2011 01:23:47

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

Re: объеденение двух запросов

serj011 написал:

данные таблицы favorit:
                      id_user1     id_user2    
строка 1          307                 291   
строка 2          291                 307

нужно сделать третий запрос, который объеденит две строки и выведет одно значение, т.е. id_user1 = 307 and id_user2 = 307 and id_user1 = 291 and id_user2 = 291

Как Вы себе представляете одновременное выполнение этих условий (которые я выделил жирным)? id_user1 не может быть одновременно равен 307 и 291 в одной строке, не так ли? Или напишите четче, чего Вы хотите.


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

Неактивен

 

#5 10.12.2011 01:45:04

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

deadka написал:

Как Вы себе представляете одновременное выполнение этих условий (которые я выделил жирным)? id_user1 не может быть одновременно равен 307 и 291 в одной строке, не так ли? Или напишите четче, чего Вы хотите.

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

Т.Е.
users.id (307) = favorit.id_user2 (307) and favorit.id_user1 (291) = '$myrow[id]' (291) [СТРОКА № 2]
AND
and users.id (307) = favorit.id_user1 (307) and favorit.id_user2 (291) = '$myrow[id]' (291) [СТРОКА № 1]

нужно найти совпадения по ДВУМ строкам из таблицы favorit и вытащить одного пользователя из таблицы user

где users.id = 307 и $myrow[id] = 291

данные таблицы favorit:
                      id_user1     id_user2     
строка 1          307                 291   
строка 2          291                 307

Неактивен

 

#6 10.12.2011 02:13:44

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

Re: объеденение двух запросов

А если сделать union двух Ваших работающих запросов (из первого поста в топике)

$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

$result_my_favorit = mysql_query("SELECT favorit.*,users.id,nik,gender,avatar,gender,city FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]' ORDER BY favorit.id DESC",$db);

и сгруппировать результат по users.id - такой результат Вам нужен?


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

Неактивен

 

#7 10.12.2011 02:32:01

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

я догадываюсь что тут без union , GROUP BY не обойтись, я пытался сделать, но не знаю как правильно, подскажите если знаете, как его правильно составить?

Неактивен

 

#8 10.12.2011 02:35:35

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

Re: объеденение двух запросов

Ну вообще, если бы Вы приложили дампы своих табличек favorite и users было бы проще wink.
Навскидку как-то так (простейший вариант):

SELECT users.id FROM users,favorit WHERE users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]'
union
(SELECT users.id FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]')


Это даже без группировки сработает, к слову.

Отредактированно deadka (10.12.2011 02:36:25)


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

Неактивен

 

#9 10.12.2011 02:55:28

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

что такое дампы?

что не так в этом запросе, выводит все подряд, т.е. выводит и то что в первом и то что во втором запросе

Неактивен

 

#10 10.12.2011 02:58:53

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

Re: объеденение двух запросов

дамп - это инструкции для создания таблиц в форме (create table t...) и сами данные в форме insert into ... values...()...

что не так в этом запросе, выводит все подряд, т.е. выводит и то что в первом и то что во втором запросе

Так мы вроде этого и добивались, разве нет? Какой результат выводится и какой результат Вы хотели бы получить (если исходить из последней версии моего запроса, где выбирается только users.id)?


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

Неактивен

 

#11 10.12.2011 03:12:41

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

короче... если не тяжело, vdonbasse.com.ua логин serj011@yandex.ru пароль 123456 "знакомства и общение" "симпатии" выводятся те пользователи, которые меня добавили в симпатии и которых я добавил в разных окнах (запросах), хочу сделать еще одну вкладку "взаимные симпатии", где будут выбираться только те, которые есть и там и там...

Неактивен

 

#12 10.12.2011 03:17:27

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

Re: объеденение двух запросов

Боюсь, что если Вы не будете прямо отвечать на мои вопросы, то мне как-то затруднительно будет подсказывать wink.

Давайте на конкретных данных. таблицы, строки в них, соответствующие запросы. Приведите наконец дампы таблиц и опять же:

SELECT users.id FROM users,favorit WHERE users.id = favorit.id_user1 and favorit.id_user2 = '$myrow[id]'
union
(SELECT users.id FROM users,favorit WHERE users.id = favorit.id_user2 and favorit.id_user1 = '$myrow[id]')


какой результат возвращает запрос?, чем он Вас не устраивает?, какой результат Вы хотите получить?


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

Неактивен

 

#13 10.12.2011 03:41:57

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

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

                      id_user1     id_user2     
строка 1          307                 291   
строка 2          291                 307

Неактивен

 

#14 10.12.2011 03:44:32

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

где мне взять эти дампы? я не мойму???

Неактивен

 

#15 10.12.2011 03:46:19

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

это код который вставляет данные в таблицу favorit
$result = mysql_query ("INSERT INTO favorit (id_user1,id_user2,text) VALUES ('$id_user1','$id_user2','$text')");

Неактивен

 

#16 10.12.2011 03:53:21

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

Re: объеденение двух запросов

Чтобы сделать дамп, нужно войти в базу через phpmyadmin или другой доступный Вам клиент mysql. если есть доступ по ssh на сервер, то там обычно есть программа mysqldump, ей также дамп снимается.


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

Неактивен

 

#17 10.12.2011 04:12:17

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

вообщем deadka спасибо за попытки помочь, но я уже не знаю как объяснять лучьше чем в 5 посте, попробую еще сам поразбираться...

Неактивен

 

#18 10.12.2011 04:26:33

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

Re: объеденение двух запросов

Отписал на почту.


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

Неактивен

 

#19 11.12.2011 00:12:49

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

Re: объеденение двух запросов

id фаворитов на пользователя с id=1:
select id_user2 from t_5064_favorite where id_user1=1 and id_user2 in (select id_user1 from t_5064_favorite where id_user2=1);

выборка из таблицы пользователей:
select * from t_5064_user where id in  (select id_user1 from t_5064_favorite where id_user2=1) and id in  (select id_user2 from t_5064_favorite where id_user1=1);

См. ниже

Код:

mysql> set names 'utf8';
Query OK, 0 rows affected (0.00 sec)

mysql> drop table if exists t_5064_user;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table if exists t_5064_favorite;
create table t_5064_favorite(id_user1 integer,id_user2 integer);
Query OK, 0 rows affected (0.00 sec)

mysql> create table t_5064_user(id integer,name varchar(80));
Query OK, 0 rows affected (0.00 sec)

mysql> create table t_5064_favorite(id_user1 integer,id_user2 integer);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_5064_user values(1,'Вася'),(2,'Коля'),(3,'Ваня'),(4,'Петя'),(5,'Витя');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

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

mysql>
mysql> select id_user2 from t_5064_favorite where id_user1=1 and id_user2 in (select id_user1 from t_5064_favorite where id_user2=1);
+----------+
| id_user2 |
+----------+
|        2 |
|        5 |
+----------+
2 rows in set (0.00 sec)

mysql> select * from t_5064_user where id in  (select id_user1 from t_5064_favorite where id_user2=1) and id in  (select id_user2 from t_5064_favorite where id_user1=1);
+------+----------+
| id   | name     |
+------+----------+
|    2 | Коля |
|    5 | Витя |
+------+----------+
2 rows in set (0.00 sec)

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

Неактивен

 

#20 11.12.2011 02:08:37

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

deadka, простите за тупость, но я не могу понять какой запрос из двух написанных вами нужно использовать, или их нужно объединять?

Неактивен

 

#21 11.12.2011 02:30:33

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

Re: объеденение двух запросов

Объединять их, конечно, не нужно.

Использовать - хмм, ну смотря что Вы хотите получить.

Если исходить из первоначальной постановки вопроса, то наверное как-то так Вы подразумевали (выбираем все данные тех пользователей, у которых "взаимное фаворитство" с пользователем, у которого id=$myrow['id']):

$result_my_favorit = mysql_query("SELECT * FROM users WHERE id IN (SELECT id_user1 FROM favorit WHERE id_user2=" . $myrow['id'] . ") AND id IN (SELECT id_user2 FROM favorit WHERE id_user1=" . $myrow['id'] . ") ORDER BY id",$db);

Отредактированно deadka (11.12.2011 02:40:47)


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

Неактивен

 

#22 11.12.2011 13:59:36

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: объеденение двух запросов

Спасибо огромное deadka, все работает smile я бы не когда не мог подумать, что такая вроде не сложная задача, может оказаться таким сложным запросом, для меня smile

Неактивен

 

Board footer

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