hab ganz vergessen hier das Ergebnis zu schreiben.
Ich mach es jerzt mit 2 Queries. Die Freunde ersten Grades selecte ich vorher und prüfe dann einfach mit NOT IN().
Das dumme ist nur, das diese Query umso länger braucht je mehr Freunde 2ten Grades man hat.
PHP-Code:
$str_sql = "SELECT SQL_CACHE DISTINCT " .
"IF " .
" (t2.user_id = IF(t1.user_id=".$user_id.",t1.fellow_id,t1.user_id), " .
" t2.fellow_id, " .
" t2.user_id) AS distant_fellow_id " .
"FROM s_user_fellow t1 " .
"" .
"JOIN s_user_fellow t2 " .
"ON IF(t1.user_id=".$user_id.",t1.fellow_id,t1.user_id) = " .
" IF(t2.user_id=IF(t1.user_id=".$user_id.",t1.fellow_id,t1.user_id), " .
" t2.user_id, " .
" t2.fellow_id) " .
"AND " .
"" .
"(IF( t2.user_id = IF( t1.user_id =".$user_id.", t1.fellow_id, t1.user_id ) , " .
" t2.fellow_id, " .
" t2.user_id ) != ".$user_id.") " .
"AND " .
"" .
"IF( t2.user_id = IF( t1.user_id =".$user_id.", t1.fellow_id, t1.user_id ) , " .
" t2.fellow_id, " .
" t2.user_id ) NOT IN(".implode(",", $first_grade).") " .
"" .
" WHERE " .
"(t1.user_id = ".$user_id." OR t1.fellow_id = ".$user_id.")".
" AND t1.fellow_status = 'true'";
//$first_grade ist ein Array mit ID's der Freunde ersten Grades
//$user_id ist die ID des Users um den es geht
Hier mal das EXPLAIN Output der Query
Code:
+----+-------------+-------+-------+---------------+---------+---------+------+-------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+-------+------------------------------+ | 1 | SIMPLE | t1 | ALL | user_id | NULL | NULL | NULL | 16599 | Using where; Using temporary | | 1 | SIMPLE | t2 | index | NULL | user_id | 8 | NULL | 16599 | Using where; Using index | +----+-------------+-------+-------+---------------+---------+---------+------+-------+------------------------------+
Danke.
EDIT:
Sorry wegen der Breite, aber das Explain lässt sich so eindeutig besser lesen.
Einen Kommentar schreiben: