Mysql vrienden van vrienden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Derk  Janssen

Derk Janssen

17/12/2010 10:08:30
Quote Anchor link
Beste mensen,
Ik heb een vraagje over deze query.
In de tweede select wil ik graag g2.user_name en g2.user_id uit lezen maar als ik die achter f2.naar zet krijg ik de volgende error: 1241 - Operand should contain 1 column(s)
Hoe kan ik dit oplossen om het toch voor elkaar te krijgen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
 *
FROM
 ".TABLE_FRIENDS." AS f1  
WHERE
 van
IN
 (
 SELECT
  f2.naar
 FROM
  ".TABLE_FRIENDS." AS f2,
  ".TABLE_USERS." AS g2  
 WHERE f2.van = '".$_SESSION['user_id']."'
 AND
  f2.naar=g2.user_id
 )
 
PHP hulp

PHP hulp

22/12/2024 06:41:12
 
Bas Cost Budde

Bas Cost Budde

17/12/2010 10:30:49
Quote Anchor link
De tweede select dient als referentie voor de IN-clause. Je wil de records uit tabel f1 ophalen waar het veld 'van' in de tweede select voorkomt. Je kunt niet een kolom aan twee kolommen koppelen, in ieder geval niet op deze manier.

Wat voor waarde staat er in 'van'?
 
John D

John D

17/12/2010 10:44:59
Quote Anchor link
Je kan geen gegevens ophalen/uitlezen van de tweede SELECT. De tweede SELECT dient alleen maar als referentie. Je moet dus een andere query gaan bouwen. Je moet dus gewoon een join of een outer join maken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
select c.user_name en c.user_id
from TABLE_FRIENDS a
    ,TABLE_FRIENDS b
    ,TABLE_USERS c
where a.van  = b.naar
and   b.naar = c.user_id
and   b.naar = $_SESSION['user_id']
Gewijzigd op 17/12/2010 11:05:53 door John D
 
Derk  Janssen

Derk Janssen

17/12/2010 10:49:47
Quote Anchor link
Bas Cost Budde,
Bedankt weer iets geleerd.
Daar zit het id in van de vriend waar hij vrienden van gaat selecteren.
Ik ben er al een tijdje mee aan het stoeien.
Wat hij heel simpel moet doen is vrienden van mijn vrienden selecteren.


Toevoeging op 17/12/2010 12:23:13:

John D Wat ik nu heb is dit hier onder.
Wat alleen nog niet werkt is het overslaan van mensen waar ik ook al mee bevriend ben. Die wil ik namelijk niet weergeven en ik dacht ik doe dat met AND f2.naar!=f1.naar Maar dat wil helaas niet werken. Heeft iemand een idee?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT g.user_id, g.user_name, g.avatar_default, f2.bid, f2.naar, a.avatar
FROM ".TABLE_FRIENDS." AS f1,
     ".TABLE_FRIENDS." AS f2,
     ".TABLE_USERS." AS g
     LEFT JOIN
        ".TABLE_AVATAR." AS a
     ON
        a.bid = g.avatar_default  
     WHERE
      f2.van=f1.naar AND f1.van='".$_SESSION['user_id']."'
     AND f2.naar=g.user_id
     AND f2.naar!=f1.van
     AND f2.naar!=f1.naar
 
Derk  Janssen

Derk Janssen

19/12/2010 14:47:56
Quote Anchor link
bump
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 15:01:47
Quote Anchor link
Wat heb je in die twee dagen geprobeerd?
 
Derk  Janssen

Derk Janssen

19/12/2010 20:24:30
Quote Anchor link
Ik ben er al een tijdje mee bezig en de manier van John D leek te werken maar de dingen zo als f1.naar!=f2.naar krijg ik niet voor elkaar.
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 20:40:38
Quote Anchor link
Hm, en op pfz krijg je ook feedback, bijvoorbeeld over de "richting" van de relatie, die door je velden 'voor' en 'van' wordt geintroduceerd.

Dat is ook een lastig onderwerp hoor. Ik kwam het tegen toen ik een kabelaansluitadministratie schreef.

Even een stapje terug. Wat zijn "je vrienden"?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT van
FROM ".TABLE_FRIENDS."
WHERE naar = ".$_SESSION['user_id']."
UNION
SELECT naar
FROM ".TABLE_FRIENDS."
WHERE van = ".$_SESSION['user_id']."


klopt dat?
 
Derk  Janssen

Derk Janssen

19/12/2010 20:48:33
Quote Anchor link
Bedankt Bas Cost Budde
Zo selecteer ik mijn vrienden.
Naar is het id van een vriend.
SELECT naar
FROM ".TABLE_FRIENDS."
WHERE van = ".$_SESSION['user_id']."

Helaas kan ik de colom naam niet meer veranderen om dat de site al te groot is.
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 20:52:58
Quote Anchor link
je ziet mij toch twee selects uitvoeren en die koppelen met een UNION? Als ik in het veld 'van' voorkom, zit ik in jouw resultaat; als ik in het veld 'naar' voorkom, niet. Als ik jouw vriend ben, kan het dan zo zijn dat jij niet mijn vriend bent?

Ik heb het niet over je kolomnamen. (natuurlijk kun je die veranderen... dat is de vraag toch niet)
 
Derk  Janssen

Derk Janssen

19/12/2010 21:02:37
Quote Anchor link
Bas Cost Budde dat kan inderdaad, je hoeft je vriend niet te accepteren maar je kan hem wel terug toevoegen. Dan ben je bv met mijn een mutual friend.
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 21:21:28
Quote Anchor link
Oh; dus "vrienden van vrienden" is een gerichte betrekking. Dat maakt het probleem minder moeilijk dan ik dacht.

Je zegt over je poging "f2.naar!=f1.naar": dat wil helaas niet werken. De schrik van elke helpdeskmedewerker. Krijg je resultaten uit de query, of een foutmelding? Komen er correcte resultaten voor in de query? Komen er foute resultaten voor in de query? Kom je correcte resultaten tekort?

Writer suggestions, rule 12: Be more or less specific. :)
 
Derk  Janssen

Derk Janssen

19/12/2010 22:04:59
Quote Anchor link
Het resultaat is correct alleen laat hij ook mensen zien die al in mijn vrienden staan die probeerde ik te filteren door middel van f2.naar!=f1.naar maar helaas negeert hij dat gewoon en hij geeft geen fout, anders kon ik verder zoeken op de fout. Als ik het om draai dus zo als hier onder werkt het nog niet.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT g.user_id, g.user_name, g.avatar_default, f2.bid, f2.naar, a.avatar
FROM ".TABLE_FRIENDS." AS f1,
     ".TABLE_FRIENDS." AS f2,
     ".TABLE_USERS." AS g
     LEFT JOIN
        ".TABLE_AVATAR." AS a
     ON
        a.bid = g.avatar_default  
     WHERE
       f2.naar!=f1.van
     AND
      f2.naar!=f1.naar
     AND
      f2.van=f1.naar AND f1.van='".$_SESSION['user_id']."'
     AND f2.naar=g.user_id
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 22:12:13
Quote Anchor link
we gaan je query even anders inrichten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT g.user_id, g.user_name,
  g.avatar_default, f2.bid, f2.naar,
  a.avatar
FROM ".TABLE_FRIENDS." AS f1
INNER JOIN ".TABLE_FRIENDS." AS f2 ON f2.van=f1.naar
INNER JOIN ".TABLE_USERS." AS g ON f2.naar=g.user_id
LEFT JOIN ".TABLE_AVATAR." AS a ON a.bid = g.avatar_default  
WHERE f2.naar!=f1.van
  AND f2.naar!=f1.naar
  AND f1.van=".$_SESSION['user_id']."


quotes verwijderd om session[userid] omdat dat toch een int moet zijn?

Tussentijds testen. Geeft deze query dezelfde resultaten?
 
Aad B

Aad B

19/12/2010 22:23:07
Quote Anchor link
filteren van vrienden die je al hebt kan je doen met een NOT EXISTS.
Gebruik dus de eenvoudigste werkende query (van John D??) en voeg daar aan toe:
AND NOT EXISTS (SELECT 1
FROM TABLE_FRIENDS f3
WHERE f3.xxx=f1.xxx
xxx zelf nog even uitzoeken.
 
Derk  Janssen

Derk Janssen

19/12/2010 22:38:41
Quote Anchor link
Bas Cost Budde bedankt hij laat nog steeds het zelfde zien helaas.

Add b ik zal eens kijken.
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 22:39:09
Quote Anchor link
Dat lijkt me wel een dure oplossing, Aad. In de genoemde join op table_friends zit die informatie al.

Ik lees wel een interessant, relevant artikel, dat meer informatie geeft over NOT EXISTS en LEFT JOIN:
http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/

Toevoeging op 19/12/2010 22:41:02:

Derk, niks 'helaas', dat is juist goed. Ik heb namelijk de query alleen syntactisch verbouwd (okee, en de joins expliciet gemaakt).

Neem de velden 'van' en 'naar' uit de tabellen f1 en f2 eens op in de select. Misschien geeft dat aan waar je verwachtingen mislopen.
 
Aad B

Aad B

19/12/2010 22:44:12
Quote Anchor link
"In de genoemde join op table_friends zit die informatie al"
Je wilt de informatie juist uitsluiten. Een EXISTS of een NOT EXISTS kan fijn via een index unique scan (heet dat ook zo in MySQL?) en is du heel efficient. De enige oplossingen die mijn mijn visie "dure oplossingen" zijn zijn full table scans, dus zolang je geen full table scan toevoegt vind ik elke query okee.
 
Bas Cost Budde

Bas Cost Budde

19/12/2010 23:00:17
Quote Anchor link
Daar heb je wel helemaal gelijk in! Sjonge, ik had de full table scan niet gespot. Dat wordt overwerken deze week :) ik werk met Postgres, zelfde verhaal.

Zal ik al mijn queries eens langslopen op het ongelijk-testen van twee velden... dat is toch de trigger?
 
Derk  Janssen

Derk Janssen

20/12/2010 02:54:30
Quote Anchor link
Bas Cost Budde bedankt ik heb het allemaal een door gelezen maar wat ik niet snap is dat als ik f2.naar alleen in de select zet ik nog steeds een id krijg die ook al in de f1.naar naar buiten komt terwijl we aan geven f2.naar!=f1.naar. Dat is het grootste probleem.
 
Derk  Janssen

Derk Janssen

22/12/2010 15:39:02
Quote Anchor link
Bump
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.