Скъсяване на код с подходяща заявка?

FestarBG

Registered
Здравейте,
пиша сайт, в който потребителите могат да стават приятели.Записвам приятелствата в таблива friendships със следната структура:
`id` int(15) unsigned NOT NULL AUTO_INCREMENT,
`to` int(20) unsigned NOT NULL DEFAULT '0',
`from` int(20) unsigned NOT NULL DEFAULT '0',
`accepted` tinyint(1) unsigned NOT NULL DEFAULT '0'
Като предполагам е ясно - to иска приятелство на from, ако from го приеме се записва 1 в accepted.В to и from се записват id-та.Интересува ме как да изкарам всички приятели на даден човек, като му знам id-то и използвам само една заявка.Сега го правя така:
Код:
$friend_bd = $sql->fetch_all_array("SELECT `to`,`from` FROM `friendships` WHERE `to`='$username_id' OR `from`='$username_id'");
После масива го обработвам на дълго и нашироко за да премахна id-тата, които съвпадат с id-то на потребителя.Все пак неможе да си приятел със себе си.. :D
Идеи?
 
сещам се за нещо...
таблица frequests (от friend requests)
с полета from, to и accept и ако accept е 1 добавяш в таблицата с приятели на всеки потребител другото id или ако ти е др начина на приятелства си го правиш както са ти таблиците...
 
Можеш след като потребителя приеме приятелството да триеш реда в таблицата requests (или както е там), вкарваш в таблицата с потребителите ид-то на новият приятел в една колона "friends" под следната форма:
f1,f2,f3,f4,f5,f6,f7 и тнт. Където f* е ID на приятел. След това при изваждане - explode и работата е опечема :)
 
Помисли върху следното.
Потребител с айди 1 иска да е приятел на ид 3.


Записваш във временна таблица кой с кой иска да е приятел.
това ще изглежда така във временната:
id-to-from
id-1-3


и ако някой даде accepted тогава да триеш дадения запис/и от временната таблица и да записва в твоята таблица следното:

id-to-from
id-1-3
id-3-1

така и в двете посоки записваш кой на кой е приятел.
След това ако търсиш приятелите на 3 трябва само да ровиш в колоната to и от там да вадиш всичко за него.


НЕ съм сигурен дали това е най-добрата идея но само за нея се сещам в
момента.
Ако се сетя нещо друго ще пиша.
 
Като че ли идеята на админ е най-добрата до момента. Само че може да направиш нещо друго. Преди заявката направи един метод (ако използваш ООП), който да проверява дали потребителя иска приятелство на себе си. Ето един пример:
Да предположим, че при успешен логин записваш подобна сесия: $_SESSION['LOGGED'] = 'user';
Код:
<?php

public function Check($user, $user_friend)
{
	$user = $_SESSION['LOGGED'];
	
	if (isset($user))
	{
		if ($user != $user_friend)
		{
			return true;
		}
		
		else 
		{
			return false;
		}
	}
	
	return false;
}
?>
И преди да запишеш заявката просто направи една проверка. Ако метода върне true значи потребителя е влязъл и не иска да бъде приятел със себе си.
 
Код:
SELECT * FROM users JOIN
(SELECT `to`,GROUP_CONCAT(`from` SEPARATOR ',') X FROM friendships WHERE `to`!=`from` GROUP BY `to`) A
ON users.id=`to` AND FIND_IN_SET(users.id,X); # [+ AND users.id=1001]
Забравяме за масивите 8)
Edit:
Код:
ON users.id=`to` AND FIND_IN_SET(users.id,X) AND approved; # [+ AND users.id=1001]
 
Tака трябва да е

Код:
SELECT * FROM users JOIN
(SELECT `to`,GROUP_CONCAT(`from` SEPARATOR ',') X FROM friendships WHERE `to`!=`from` AND accepted GROUP BY `to`) A
ON FIND_IN_SET(users.id,X) WHERE `to`=1;
WHERE `to`=1 това е user.id , за когото търсим приятелите
tested :)
 

Back
Горе