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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

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

Сообщения:  [1-10]   [11-18] 

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

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

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

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

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

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

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

  Ответить  
 
 автор: 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 в 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
)


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

  Ответить  
 
 автор: 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:31)   письмо автору
 
   для: kosta_in_net   (19.01.2012 в 14:26)
 

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

  Ответить  
 
 автор: 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: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:20)   письмо автору
 
   для: tima2010   (19.01.2012 в 13:59)
 

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

  Ответить  
 
 автор: 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 нет
Список пользователей которые добавили вас в друзья но их вы не добавили

  Ответить  

Сообщения:  [1-10]   [11-18] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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