|
|
|
| Привет, помогите пожалуйста реализовать следующий запрос при такой структуре таблицы:
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`
?>
|
так мы получили тех юзеров у которых есть я, но как прямо в запросе выбрать тех пользователей которых нет у меня
или как лучше реализовать такой запрос? | |
|
|
|
|
|
|
|
для: tima2010
(18.01.2012 в 11:05)
| | Отношение "есть я" и "я есть у" как выглядят на практике? Т.е. какой столбец за что отвечает? | |
|
|
|
|
|
|
|
для: cheops
(18.01.2012 в 12:02)
| | my_id - ид пользователя который произвел операцию
friends_id - ид пользователя которого добавил my_id
Есть список пользователей, рядом с ними отображается кнопка добавить в друзья
при нажатии идет запись в базу
хочется вывести блок типа:
Возможно вы их знаете
где будут отображаться пользователи которые добавили меня но я их не добавил | |
|
|
|
|
|
|
|
для: tima2010
(18.01.2012 в 12:29)
| | >my_id - ид пользователя который произвел операцию
>friends_id - ид пользователя которого добавил my_id
>
>Есть список пользователей, рядом с ними отображается кнопка добавить в друзья
>при нажатии идет запись в базу
>
>хочется вывести блок типа:
>Возможно вы их знаете
>где будут отображаться пользователи которые добавили меня но я их не добавил
это скорей будет список пригласивших Вас в друзья, а возможно Вы их знаете это, полагаю, чуток другой принцип отбора | |
|
|
|
|
|
|
|
для: Lotanaen
(18.01.2012 в 15:38)
| | Да Вы правы, список пригласивших Вас в друзья
вот не могу сформировать запрос, не хватает знаний :( | |
|
|
|
|
|
|
|
для: 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 "Меня нет в друзьях";
}
?>
| как-то так. | |
|
|
|
|
|
|
|
для: Sfinks
(18.01.2012 в 21:16)
| | Да двумя запросами это реально решить, думал есть решение намного проще, видимо изначально для такой задачи нужно продумывать и менять структуру базы
Боюсь за скорость, да и все манипуляции проходят через ajax подгрузку файлов. | |
|
|
|
|
|
|
|
для: 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
Какие строки должны взяться? | |
|
|
|
|
|
|
|
для: kosta_in_net
(19.01.2012 в 13:10)
| | Это таблица дружбы между пользователями
my_id кто добавил
friends_id кого добавили
нужно выбрать my_id тех пользователей которые есть в friends_id но friends_id у my_id нет
Список пользователей которые добавили вас в друзья но их вы не добавили | |
|
|
|
|
|
|
|
для: tima2010
(19.01.2012 в 13:59)
| | я имел в виду, строки с каким номером должны выбраться из конкретного примера? | |
|
|
|
|
|
|
|
для: kosta_in_net
(19.01.2012 в 14:20)
| | К примеру я пользователь с my_id = 2
По идеи запрос должен вернуть мне id пользователя: 1
т.к. у меня уже есть в друзьях friends_id 3 но нет в друзьях friends_id 1 | |
|
|
|
|
|
|
|
для: 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:26)
| | Спасибо kosta_in_net
то, что нужно. | |
|
|
|
|
|
|
|
для: 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:35)
| | Да разобрался, меня в этой теме больше всего волновала конструкция запроса, а именно эта:
NOT IN (
SELECT friends_id
FROM friends
WHERE my_id =2
GROUP BY friends_id
)
|
буду знать, что можно выполнять вложенный запрос так :) спасибо | |
|
|
|
|
|
|
|
для: 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
|
Думаю запросы писать - лишнее. | |
|
|
|
|
|
|
|
для: deimand
(19.01.2012 в 16:23)
| | А что будет работать быстрее?
добавление друзей производится через ajax | |
|
|
|
|
|
|
|
для: tima2010
(19.01.2012 в 16:48)
| | Два запроса будет только в случае согласия стать другом, во всех остальных случаях, запрос будет простой (select u1(u2) from table where status='нужный вам') и легкий (в плане производительности).
В данной ситуации в один запрос можно брать:
Всех своих друзей
Всех кого ты добавил в друзья
Всех кто предложил тебе дружить - это и есть ваш вопрос
Всех кто отказался с тобой дружить
Всех друзей друга
Всех кто отказался дружить с другом
Всех кому предложил дружить друг
Всех кто предложил дружить другу
Наверняка что-то пропустил
Можно также легко ввести группы друзей (круги), добавив еще одно поле.
Кто касается производительности, то все зависит от конкретного случая.
Если чаще происходит выборка данных, нежели вставка, то и оптимизировать нужно структуру таким образом, чтобы выборка работала как можно быстрее, пусть даже вставка данных будет тяжелее.
А если наоборот, например сбор статистики, которой очень много сохраняется, но она редко просматривается, то оптимизировать нужно как раз сохранение данных, а не сразу раскладывать все по полочкам, тратя на это намного больше ресурсов. | |
|
|
|