Blocking Amis SQL (Super SQL SQL ??)
-
15-11-2019 - |
Question
Bonjour, j'ai des problèmes avec ce SQL.Fondamentalement, il affiche des statuts que mes amis ont affiché, et cela filtre les amis que j'ai bloqué.
Le SQL est SLOOOOOWWWWWWWW. Cela prend 2 secondes pour le traiter.Quel semble être le problème.(J'ai répertorié les tables et quelques exemples de la façon dont il a l'air sous le SQL) Merci d'avance! Le SQL ....
SELECT from_user_id,content,wall.date, wall.wall_type, users.id, users.displayname
FROM wall
INNER JOIN friendship ON ( wall.from_user_id =friendship.user_a OR wall.from_user_id = friendship.user_b )
INNER JOIN users ON (wall.from_user_id = users.id)WHERE users.id not in (select blocked_id from blocklist where user_id = 1) and (wall.wall_type = 'home' OR wall.wall_type = 'profile' or wall.wall_type = 'topro') AND (
(friendship.user_a = 1 and friendship.user_b = wall.from_user_id)
or
(friendship.user_a = wall.from_user_id and friendship.user_b = 1) or (wall.user_id_of_wall = 1 or type_id = 1 or from_user_id = 1))GROUP BY wall_id ORDER BY date DESC LIMIT 10
(Nom du tableau: Blocklist)
user_id | blocked_id
1 74
1 70
1 94
1 81
(Nom de la table: ami)
user_a user_b status date
1 93 1 1297323354
1 79 1 1297323409
1 81 1 1297323403
1 82 1 1297323398
1 85 1 1297323389
1 90 1 1297323367
1 89 1 1297323373
(Nom du tableau: Utilisateurs)
id displayname
1 Kenny Jack
8 Wale Robinson
7 Victor WIlliams
6 Micheal Harris
9 Micheal Boston
10 Yestor Smith
La table murale
wall_id wall_type user_id_of_wall type_id from_user_id content viewed date
5 profile 8 8 8 Just chilling! 0 1296858001
merci !!!
La solution
NOT IN is used for fixed values, use NOT EXISTS instead :
SELECT from_user_id,content,wall.date, wall.wall_type, users.id, users.displayname
FROM wall
INNER JOIN friendship ON ( wall.from_user_id =friendship.user_a OR wall.from_user_id = friendship.user_b )
INNER JOIN users ON (wall.from_user_id = users.id)
WHERE not exists (select * from blocklist where users.id = blocked_id AND user_id = 1) and wall.wall_type IN ('home', 'profile', 'topro') AND (
(friendship.user_a = 1 and friendship.user_b = wall.from_user_id)
or
(friendship.user_a = wall.from_user_id and friendship.user_b = 1) or (wall.user_id_of_wall = 1 or type_id = 1 or from_user_id = 1))
GROUP BY wall_id
ORDER BY date DESC LIMIT 10
[EDIT] Use IN for fixed values (wall_type)...
Autres conseils
always use WITH (NOLOCK) on read-only queries!
also, please remove all your paranthesis on your JOIN clause, did you copy and paste this from MS Access?