Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Exkludera mina egna vänner

Postades av 2009-01-22 20:00:08 - Thomas Roman, i forum mysq, Tråden har 6 Kommentarer och lästs av 1522 personer

Jag på att lägga in en liten vänner-funktion på en sida jag har och jag har lagt till så att man kan se vilka vänner en person har. Men nu försöker jag få till så att dom vänner som man själv redan är vän med ska markeras annorlunda och här blir det lite problem.
Jag kan självklart göra en ny fråga för varje vän och kontrollera, men det känns inte så effektivt.

Tabellerna:
[Users]
ID

[Friends]
UserID
FriendID

Så som jag har gjort det så kommer det att bli dubbla connections mellan vänner, en för att Person A har Person B som vän och så en för att Person B har Person A som vän. Även om det blir dubbelt så mycket data i den tabellen så känns det som att det blir enklare att använda. Eller borde jag alltid bara ha en koppling mellan personerna?

Men som sagt, först och främst vill jag få till så att ens egna vänner markeras annorlunda. Nu får jag fram vännerna genom:
<code>
SELECT Users.ID FROM Users, Friends WHERE Friends.UserID = X AND Users.ID = Friends.FriendID
</code>
där X är personens ID som man vill kolla upp.


/Thomas


Svara

Sv: Exkludera mina egna vänner

Postades av 2009-01-22 21:25:43 - Niklas Jansson

Om du kör med den du har så borde du kunna bygga på med joins eller subselects så här:

Hämta mina vänner:
SELECT FriendID FROM Friends WHERE UserID = X

Hämta mina vänners vänner:
SELECT FriendID FROM Friends WHERE UserID IN (SELECT FriendID FROM Friends WHERE UserID = X)

Det går att skriva om till en join men jag orkar inte tänka just nu. Observera dock att det här kommer kunna ge dubletter, så du borde nog skriva det som

SELECT DISTINCT FriendID FROM Friends WHERE UserID IN (SELECT FriendID FROM Friends WHERE UserID = X)

Och för att ta bort "mina vänner" är det ju egentligen bara att matcha detta mot vännerna

SELECT DISTINCT FriendID FROM Friends WHERE UserID IN (SELECT FriendID FROM Friends WHERE UserID = X) AND FriendID NOT IN (SELECT FriendID FROM Friends WHERE UserID = X)

Eller lite tydligare:
MyFriends = SELECT FriendID FROM Friends WHERE UserID = X

SELECT DISTINCT FriendID FROM Friends WHERE UserID IN MyFriends AND FriendID NOT IN MyFriends


Svara

Sv:Exkludera mina egna vänner

Postades av 2009-01-23 01:53:25 - Thomas Roman

Hmm jag hänger inte med riktigt.

Ska den sista bli:
<code>
SELECT DISTINCT FriendID FROM Friends WHERE UserID IN (SELECT FriendID FROM Friends WHERE UserID = X) AND FriendID NOT IN (SELECT FriendID FROM Friends WHERE UserID = X)
</code>
Blir inte den koden väldigt tung att köra när två extra SELECT är med?

Hur som helst ser jag inte att den där koden är vad jag är ute efter. När jag hämtar någon annan persons vänlista så vill jag samtidigt ha en variabel som blir 0 eller 1 beroende på om jag redan är vän med den personen. Typ.


/Thomas


Svara

Sv: Exkludera mina egna vänner

Postades av 2009-01-23 10:49:16 - Niklas Jansson

Okej, vi tar det i steg. Om jag är "X", så har vi:

SELECT FriendID FROM Friends WHERE UserID = X

För att ta fram mina vänner, right?
Låt säga att Y är min vän - för att ta fram hans vänner så använder vi

SELECT FriendID FROM Friends WHERE UserID = Y

Men eftersom jag kan ha flera vänner så kan vi (om jag skulle ha en tabell "MyFriends", som bara är en lista på mina vänner) skriva:

SELECT FriendID FROM Friends WHERE UserID IN MyFriends

För att få alla mina vänners vänner. Där får vi ju dubletter, om jag har två vänner A och B, och båda är vänner med C, så vi måste använda DISTINCT:

SELECT DISTINCT FriendID FROM Friends WHERE UserID IN MyFriends

MyFriends är ju exakt sanmma sak som "SELECT FriendID FROM Friends WHERE UserID = X", så vi slår ihop det till

SELECT DISTINCT FriendID FROM Friends WHERE UserID IN (SELECT FriendID FROM Friends WHERE UserID = X)

Ok?

Detta kan vi också skriva om till en join, något i stil med:

SELECT FF.FriendID FROM Friends FF
LEFT JOIN Friends F
ON FF.UserID = F.FriendID
WHERE F.UserID = X

Den kan då gå lite fortare (men databasmotorer kan ibland optimera ner det till samma kod ändå). Tipset är att börja med subselectvarianten istället för joinvarianten, eftersom den är enklare.

Okej, så nu har vi en lista på "mina vänners vänner", som inte innehåller dubletter, men eventuellt också "mina vänner". Låt oss kalla "mina vänners vänner" för FF, och "mina vänner" för F.

Är du med på att vi har alla delar vi behöver; "mina vänners vänner" och "mina vänner"?
Exakt hur man sen sätter ihop det till det du vill ha är ju en annan fråga


En variant är nu helt enkelt att ta bort alla som finns i F ur FF:
FF_NOT_F SELECT ID FROM FF WHERE ID NOT IN F
FF_IN_F SELECT ID FROM FF WHERE ID IN F

och sen göra en union:
(SELECT ID, 0 AS MyFriendAlso FROM FF_NOT_F)
UNION
(SELECT ID, 1 AS MyFriendAlso FROM FF_IN_F)

Man kan också tänka sig att detta går att göra med en join, typ

SELECT FF.FriendID, F.FriendID
FF LEFT JOIN F ON FF.FriendID = F.FriendID

Då blir F.FriendID NULL för alla som inte är "mina vänner".


Svara

Sv:Exkludera mina egna vänner

Postades av 2009-01-23 14:29:20 - Thomas Roman

Jag hänger nog med nu men du har nog missförstått mig. Men jag tar först några frågor angående din kod. Är MyFriends, F, FF osv temporära tabeller eller SELECT-frågor i SELECT-frågorna (så som jag gjorde i min senaste post)?

Nu åter till missförståndet. Jag vill inte ha ut mina vänners vänner som inte är vän med mig, utan en lista över okänd person X's vänner och få indikerat om X's vän Y är vän med mig eller inte.

<code>
SELECT Users.ID, SvartMagi AS IsMyFriend FROM Users, Friends WHERE Friends.UserID = X AND Users.ID = Friends.UserID
</code>

Typ nått sånt. Där SvartMagi är kod innehållandes något som för tillfället känns som just svart magi som är true/false eller 0/1 beroende på om den aktuella Users.ID är vän med mig. X är någon person, vem som helst, som kan vara vän med mig men kan även inte vara vän med mig.


/Thomas


Svara

Sv: Exkludera mina egna vänner

Postades av 2009-01-23 17:00:01 - Oskar Johansson

Rent spontant så tänker jag:

Du returnerar två kolumner: MyFriendsFriendId & MyFriendId. MyFriendsFriendId är id på din väns vänner, MyFriendId är id på dina egna vänner.

Frågan du vill ställa är:
Ge mig alla vänner till min vän, samt gör en LEFT OUTER JOIN med mina egna vänner

Det borde bli rätt

http://en.wikipedia.org/wiki/Join_(SQL)


Svara

Sv: Exkludera mina egna vänner

Postades av 2009-01-23 23:26:01 - Håkan Borneland

Ungefär såhär:
<code>
SELECT
a.FriendID,
CASE WHEN b.UserID IS NULL THEN 'Ej Gemensam vän' ELSE 'Gemensam vän' END
FROM Friends a
LEFT OUTER JOIN Friends b ON (a.FriendID = b.FriendID) AND (b.UserID = [mitt ID])
WHERE (a.UserID = [okänds ID]);
</code>
Syntaxen stämmer väl inte riktigt med MySQL, men principen kanske framgår.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
1 892
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies