|
|
|
|
|
для: tima2010
(19.01.2012 в 16:48)
| | Два запроса будет только в случае согласия стать другом, во всех остальных случаях, запрос будет простой (select u1(u2) from table where status='нужный вам') и легкий (в плане производительности).
В данной ситуации в один запрос можно брать:
Всех своих друзей
Всех кого ты добавил в друзья
Всех кто предложил тебе дружить - это и есть ваш вопрос
Всех кто отказался с тобой дружить
Всех друзей друга
Всех кто отказался дружить с другом
Всех кому предложил дружить друг
Всех кто предложил дружить другу
Наверняка что-то пропустил
Можно также легко ввести группы друзей (круги), добавив еще одно поле.
Кто касается производительности, то все зависит от конкретного случая.
Если чаще происходит выборка данных, нежели вставка, то и оптимизировать нужно структуру таким образом, чтобы выборка работала как можно быстрее, пусть даже вставка данных будет тяжелее.
А если наоборот, например сбор статистики, которой очень много сохраняется, но она редко просматривается, то оптимизировать нужно как раз сохранение данных, а не сразу раскладывать все по полочкам, тратя на это намного больше ресурсов. | |
|
|
|
|
|
|
|
для: deimand
(19.01.2012 в 16:23)
| | А что будет работать быстрее?
добавление друзей производится через ajax | |
|
|
|
|
|
|
|
для: tima2010
(19.01.2012 в 14:57)
| | Еще можно чуть изменив структуру таблицы прийти к совершенно одну запросу от составного.
Можно поступить так:
u1 и u2 - id юзеров
status говорит о трех возможных вариантах
1 - u1 добавил u2 в друзья, u2 - и не согласился и не отказался
2 - u1 добавил u2 в друзья, u2 - отказался
3 - u1 добавил u2 в друзья, u2 - согласился
когда u2 согласился,
запись нужно продублировать еще раз, только теперь от имени u2
id1 | id2 | 3
id2 | id1 | 3
|
Думаю запросы писать - лишнее. | |
|
|
|
|
|
|
|
для: kosta_in_net
(19.01.2012 в 14:35)
| | Да разобрался, меня в этой теме больше всего волновала конструкция запроса, а именно эта:
NOT IN (
SELECT friends_id
FROM friends
WHERE my_id =2
GROUP BY friends_id
)
|
буду знать, что можно выполнять вложенный запрос так :) спасибо | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: kosta_in_net
(19.01.2012 в 14:26)
| | Спасибо kosta_in_net
то, что нужно. | |
|
|
|
|
|
|
|
для: 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
Просто хотелось убедиться, что я правильно понял задачу. Когда знаешь номера строк, которые должны выбраться, тогда можно сверить логику вычислений | |
|
|
|
|
|
|
|
для: kosta_in_net
(19.01.2012 в 14:20)
| | К примеру я пользователь с my_id = 2
По идеи запрос должен вернуть мне id пользователя: 1
т.к. у меня уже есть в друзьях friends_id 3 но нет в друзьях friends_id 1 | |
|
|
|
|
|
|
|
для: 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 нет
Список пользователей которые добавили вас в друзья но их вы не добавили | |
|
|
|
|