2010-09-01 7 views
1

Je ces deux tableaux:mysql sélectionner une ligne seulement si un champ à une autre ligne est égale à

tAccounts
id, nom, server_id

tFriends
id_lo, id_hi

maintenant , J'essaie cette requête:

SELECT FR.id_lo AS id_friend 
FROM tFriends FR, tAccounts AC 
WHERE (FR.id_hi = 4 && AC.server_id != -1) 

........ Pour obtenir les amis d'un certai n utilisateur, tout en s'assurant que le server_id de son ami est différent de '-1'!

Une idée? Il semble que la contrainte 'AC.server_id! = -1' dans la clause WHERE ne me donne pas les résultats attendus.

Répondre

1

Essayez de rejoindre la table de compte deux fois:

SELECT * 
FROM tAccounts a1 
JOIN tFriends f ON a1.id = f.id_lo 
JOIN tAccounts a2 ON a2.id = f.id_hi 
WHERE a1.id = 4 AND a2.server_id != -1 
    OR a2.id = 4 AND a1.server_id != -1 

Ou utilisez un UNION:

SELECT * 
FROM tAccounts a 
JOIN tFriends f ON a.id = f.id_lo 
WHERE f.id_hi = 4 AND a.server_id != -1 
UNION 
SELECT * 
FROM tAccounts a 
JOIN tFriends f ON a.id = f.id_hi 
WHERE f.id_lo = 4 AND a.server_id != -1 
+0

Merci Mark, donc le tien est le seul dont j'avais besoin. Une question; Comment est-ce en termes de performance? Je pourrais avoir 4-5 millions de rangs d'amitié et quelques centaines de milliers de comptes. En plus d'ajouter une boîte memcached, si nous parlons seulement de l'instruction sql; Comment puis-je obtenir de meilleures performances? Est-ce que le fait d'avoir le champ 'server_id' sur la table 'tFriends' économisera beaucoup de CPU, car cela évitera un JOIN des deux tables? – Poni

+0

@Poni: Vous devez ajouter server_id_lo et server_id_hi. Cela améliorerait les performances. La meilleure façon d'obtenir de bonnes performances est de le mesurer pour une variété de différentes requêtes/stratégies d'indexation et de voir ce qui fonctionne le mieux. –

2

Où vous joignez la condition? Il devrait être quelque chose comme ceci: (Je suppose que tFriends.id_lo est un identifiant de compte ami)

SELECT FR.id_lo AS id_friend 
FROM tFriends FR 
INNER JOIN tAccounts AC ON (AC.id = FR.id_lo AND AC.server_id != -1) 
WHERE FR.id_hi = 4 ; 
2

Vous devez joindre les deux tables; sinon, vous obtenez un produit cartésien (combinant toutes les lignes de tFriends où id_hi = 4 avec toutes les lignes de tAccounts où server_id n'est pas -1).

Essayez ceci:

SELECT FR.id_lo AS id_friend 
FROM tFriends FR 
INNER JOIN tAccounts AC ON AC.id = FR.id_hi 
WHERE (FR.id_hi = 4 && AC.server_id != -1) 
+0

je n'étais pas sûr de id_lo et id_hi à rejoindre, alors je viens de choisir un. –

Questions connexes