Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбрать друзей у которых есть я но их у меня нет
 
 автор: tima2010   (18.01.2012 в 11:05)   письмо автору
 
 

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

friends
id    |    my_id    |    friends_id
1    |    1        |    2
2    |    2        |    3
3    |    2        |    4
4    |    2        |    5
5    |    3        |    2


Выбрать тех друзей у которых есть я но их нет у меня...

Пишу такой запрос:
<?php
$my_id 
'2';
// SELECT `my_id` FROM `friends` WHERE `friends_id` = '$my_id' GROUP BY `my_id`
?>

так мы получили тех юзеров у которых есть я, но как прямо в запросе выбрать тех пользователей которых нет у меня
или как лучше реализовать такой запрос?

  Ответить  
 
 автор: cheops   (18.01.2012 в 12:02)   письмо автору
 
   для: tima2010   (18.01.2012 в 11:05)
 

Отношение "есть я" и "я есть у" как выглядят на практике? Т.е. какой столбец за что отвечает?

  Ответить  
 
 автор: tima2010   (18.01.2012 в 12:29)   письмо автору
 
   для: cheops   (18.01.2012 в 12:02)
 

my_id - ид пользователя который произвел операцию
friends_id - ид пользователя которого добавил my_id

Есть список пользователей, рядом с ними отображается кнопка добавить в друзья
при нажатии идет запись в базу

хочется вывести блок типа:
Возможно вы их знаете
где будут отображаться пользователи которые добавили меня но я их не добавил

  Ответить  
 
 автор: Lotanaen   (18.01.2012 в 15:38)   письмо автору
 
   для: tima2010   (18.01.2012 в 12:29)
 

>my_id - ид пользователя который произвел операцию
>friends_id - ид пользователя которого добавил my_id
>
>Есть список пользователей, рядом с ними отображается кнопка добавить в друзья
>при нажатии идет запись в базу
>
>хочется вывести блок типа:
>Возможно вы их знаете
>где будут отображаться пользователи которые добавили меня но я их не добавил

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

  Ответить  
 
 автор: tima2010   (18.01.2012 в 16:45)   письмо автору
 
   для: Lotanaen   (18.01.2012 в 15:38)
 

Да Вы правы, список пригласивших Вас в друзья
вот не могу сформировать запрос, не хватает знаний :(

  Ответить  
 
 автор: Sfinks   (18.01.2012 в 21:16)   письмо автору
 
   для: tima2010   (18.01.2012 в 11:05)
 

Я переформулирую немного.... Поправьте если я не прав.
Я так понимаю my_id -это id пользователя, а frends_id -это ид тех пользователей которых my_id добавил в друзья так?
Тогда вряд ли получится это сделать одним запросом и даже двумя... По крайней мере я только такое решение вижу:
<?php
  $my_id 
1;
  
$frends mysql_query("SELECT `friends_id` FROM `friends` WHERE `my_id`=$my_id");
  while(
$friend mysql_fetch_array($friends)){
    
$have_i_am mysql_query("SELECT `id` FROM `friends` WHERE `my_id`={$friend[0]} && `friends_id`=$my_id");
    if(
mysql_num_rows($have_i_am))
      echo 
"Я есть в друзьях";
    else echo 
"Меня нет в друзьях";
  }
?>
как-то так.

  Ответить  
 
 автор: tima2010   (18.01.2012 в 21:34)   письмо автору
 
   для: Sfinks   (18.01.2012 в 21:16)
 

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

  Ответить  
 
 автор: kosta_in_net   (19.01.2012 в 13:10)   письмо автору
 
   для: tima2010   (18.01.2012 в 21:34)
 

я ничё не понял... Из этого:
friends
id | my_id | friends_id
1 | 1 | 2
2 | 2 | 3
3 | 2 | 4
4 | 2 | 5
5 | 3 | 2
Какие строки должны взяться?

  Ответить  
 
 автор: tima2010   (19.01.2012 в 13:59)   письмо автору
 
   для: kosta_in_net   (19.01.2012 в 13:10)
 

Это таблица дружбы между пользователями
my_id кто добавил
friends_id кого добавили

нужно выбрать my_id тех пользователей которые есть в friends_id но friends_id у my_id нет
Список пользователей которые добавили вас в друзья но их вы не добавили

  Ответить  
 
 автор: kosta_in_net   (19.01.2012 в 14:20)   письмо автору
 
   для: tima2010   (19.01.2012 в 13:59)
 

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

  Ответить  
 
 автор: tima2010   (19.01.2012 в 14:23)   письмо автору
 
   для: kosta_in_net   (19.01.2012 в 14:20)
 

К примеру я пользователь с my_id = 2
По идеи запрос должен вернуть мне id пользователя: 1
т.к. у меня уже есть в друзьях friends_id 3 но нет в друзьях friends_id 1

  Ответить  
 
 автор: kosta_in_net   (19.01.2012 в 14:26)   письмо автору
 
   для: tima2010   (19.01.2012 в 14:23)
 

SELECT id, my_id, friends_id
FROM friends
WHERE friends_id =2
AND id
NOT IN (

SELECT friends_id
FROM friends
WHERE my_id =2
GROUP BY friends_id
)
GROUP BY my_id

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

  Ответить  
 
 автор: tima2010   (19.01.2012 в 14:31)   письмо автору
 
   для: kosta_in_net   (19.01.2012 в 14:26)
 

Спасибо kosta_in_net
то, что нужно.

  Ответить  
 
 автор: kosta_in_net   (19.01.2012 в 14:35)   письмо автору
 
   для: tima2010   (19.01.2012 в 14:31)
 

оператор IN проверяет наличие my_id в результатах выборки вложенного запроса (и его там не должно быть, поскольку NOT), а вложенный запрос возвращает все friends_id, найденные у my_id

Но я запутался с именами. вместо id нужно сравнивать my_id, так что, правильный запрос:

SELECT id, my_id, friends_id
FROM friends
WHERE friends_id =2
AND my_id
NOT IN (

SELECT friends_id
FROM friends
WHERE my_id =2
GROUP BY friends_id
)
GROUP BY my_id

  Ответить  
 
 автор: tima2010   (19.01.2012 в 14:57)   письмо автору
 
   для: kosta_in_net   (19.01.2012 в 14:35)
 

Да разобрался, меня в этой теме больше всего волновала конструкция запроса, а именно эта:


NOT IN (

SELECT friends_id
FROM friends
WHERE my_id =2
GROUP BY friends_id
)


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

  Ответить  
 
 автор: deimand   (19.01.2012 в 16:23)   письмо автору
 
   для: tima2010   (19.01.2012 в 14:57)
 

Еще можно чуть изменив структуру таблицы прийти к совершенно одну запросу от составного.

Можно поступить так:
u1 | u2 | status

u1 и u2 - id юзеров

status говорит о трех возможных вариантах

1 - u1 добавил u2 в друзья, u2 - и не согласился и не отказался
2 - u1 добавил u2 в друзья, u2 - отказался
3 - u1 добавил u2 в друзья, u2 - согласился

когда u2 согласился,
id1 | id2 | 3

запись нужно продублировать еще раз, только теперь от имени u2

id1 | id2 | 3
id2 | id1 | 3


Думаю запросы писать - лишнее.

  Ответить  
 
 автор: tima2010   (19.01.2012 в 16:48)   письмо автору
 
   для: deimand   (19.01.2012 в 16:23)
 

А что будет работать быстрее?
добавление друзей производится через ajax

  Ответить  
 
 автор: deimand   (19.01.2012 в 17:15)   письмо автору
 
   для: tima2010   (19.01.2012 в 16:48)
 

Два запроса будет только в случае согласия стать другом, во всех остальных случаях, запрос будет простой (select u1(u2) from table where status='нужный вам') и легкий (в плане производительности).

В данной ситуации в один запрос можно брать:
Всех своих друзей
Всех кого ты добавил в друзья
Всех кто предложил тебе дружить - это и есть ваш вопрос
Всех кто отказался с тобой дружить
Всех друзей друга
Всех кто отказался дружить с другом
Всех кому предложил дружить друг
Всех кто предложил дружить другу
Наверняка что-то пропустил

Можно также легко ввести группы друзей (круги), добавив еще одно поле.

Кто касается производительности, то все зависит от конкретного случая.
Если чаще происходит выборка данных, нежели вставка, то и оптимизировать нужно структуру таким образом, чтобы выборка работала как можно быстрее, пусть даже вставка данных будет тяжелее.
А если наоборот, например сбор статистики, которой очень много сохраняется, но она редко просматривается, то оптимизировать нужно как раз сохранение данных, а не сразу раскладывать все по полочкам, тратя на это намного больше ресурсов.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования