Avatar billede xsix Nybegynder
02. oktober 2008 - 03:16 Der er 19 kommentarer og
1 løsning

Select fra flere databaser

Hej Eksperter.

Har et problem med denne query, den udskriver slet ingenting i mit while loop.

$query2 = mysql_query("SELECT * FROM friendlist, players WHERE friendlist.friendid='$_SESSION[user_id]' AND friendlist.id='$_SESSION[user_id]' AND friendlist.apply = '0' AND players.id = friendlist.friendid AND players.id = friendlist.id");

Hidtil har jeg kørt den i 2 forskellige querys og 2 forskellige while loops for at få det til at virke, men nu skal jeg til at bruge en ORDER BY, og så går det ikke længere at de er i 2 forskellige while loops.

På forhånd tak,
Mvh.
XsiX
Avatar billede jensgram Nybegynder
02. oktober 2008 - 08:35 #1
Så er der vel ingen rækker, der opfylder kriterierne :)

Er du sikker på, at udtrykket også stemmer overens med hvad du vil?
Avatar billede xsix Nybegynder
02. oktober 2008 - 08:57 #2
Nej er ikke sikker, har ikke prøvet at bruge data fra flere databaser før, så er ikke sikker på hvordan det fungerer.

Sådan som jeg har det nu, hvor det kører i 2 forskellige querys ser de bare sådan her ud:
$query2 = mysql_query("SELECT * FROM friendlist, players WHERE friendlist.id='$_SESSION[user_id]' AND friendlist.apply = '0' AND players.id = friendlist.friendid");
$query3 = mysql_query("SELECT * FROM friendlist, players WHERE friendlist.friendid='$_SESSION[user_id]' AND friendlist.apply = '0' AND players.id = friendlist.id");
Og så har jeg bare prøvet at samle det hele i en, som vist i topic, og det virker så ikke.
Avatar billede jensgram Nybegynder
02. oktober 2008 - 11:28 #3
Jamen så gør du vel også to forskellige ting:

Med to queries finder du de rækker, hvor den ene betingelse gælder.

Med én query finder du de (ingen) rækker, hvor den samlede betingelse gælder.

Så i virkeligheden skal du nok snarere have fat i en OR, men så skal der desuden nok sorteres lidt i resultaterne...

Hvordan ser strukturen ud for de to tabeller - og hvad er det du vil hive ud?
Avatar billede xsix Nybegynder
02. oktober 2008 - 13:06 #4
friendlist
______________________________
| id | frinedid | apply | mail |
|____|__________|_______|______|

Og de er alle int.

Det jeg vil hive ud er alle de steder hvor ens id optræder på id's og friendid's plads, og så skal jeg bruge deres account navn, som står i databasen "players", og det henter jeg så via id'et fra friendlist.
Avatar billede xsix Nybegynder
02. oktober 2008 - 13:08 #5
Det skulle så have set lidt flottere ud med mit ASCII art, men du forstår meningen :P
Avatar billede jensgram Nybegynder
02. oktober 2008 - 13:17 #6
Ok - så ville jeg:

SELECT
  p.*
FROM
  players AS p
  friendlist AS f
WHERE
    f.id = f.friendid
  AND
    f.id = p.id
  AND
    p.id = <<<$_SESSION[user_id]>>>
  AND
    f.apply = 0
Avatar billede xsix Nybegynder
03. oktober 2008 - 12:57 #7
Det virker ikke, for der er ingen steder hvor f.id = f.friendid, så ville man jo være venner med sig selv.

Jeg har siddet og leget lidt med det, men kan ikke få det til at virke, for man skal jo have den med at f.id = '$_SESSION[user_id]' AND f.friendid = '$_SESSION[user_id]' da ens eget ID nogle gange står på f.id's plads og andre gange på f.friendid's plads, men når man bruger AND på den måde vil den jo finde de rækker hvor ens eget ID står på begge pladser, og det gør den jo ikke nogle steder. Har også prøvet at bruge OR nogle forskellige steder, men det kan jeg heller ikke få til at virke? :/
Avatar billede jensgram Nybegynder
03. oktober 2008 - 14:06 #8
Jeg skrev

f.id = f.friendid

fordi du i dine to queries havde skrevet, at både friendlist.friendid og friendlist.id skulle være lig $_SESSION[user_id] - ergo: f.id = $_SESSION[user_id] OG f.id = f.friendid


Måske du vil:

SELECT
  p.*
FROM
  players AS p
  friendlist AS f
WHERE
    f.id = p.id
  AND
    f.apply = 0
  AND (
      f.id = <<<$_SESSION[user_id]>>>
    OR
      p.id = <<<$_SESSION[user_id]>>>
  )


Men det er et gæt :)
Avatar billede xsix Nybegynder
03. oktober 2008 - 14:41 #9
Det virker ikke, ændrede det sådan at det blev til:
$query2 = mysql_query("SELECT * FROM players AS p, friendlist AS f WHERE f.apply = 0 AND (f.friendid = '$_SESSION[user_id]' OR f.id = '$_SESSION[user_id]') AND (p.id = f.friendid OR p.id = f.id)");

Det virker så at dem der ligger under f.id (og IKKE f.friendid)  kommer frem, men alle links er med samme id.
Ville lige tage med at det er sådan her jeg udskriver det:

echo nl2br("\n<b>Friend List</b>\n");
while($row = mysql_fetch_array($query2)) {
?><a href="profile.php?id=<? echo $row["id"]; ?>"><? echo nl2br($row["accountname"] . "\n"); ?></a>
<?
}
?>
Avatar billede jensgram Nybegynder
03. oktober 2008 - 14:48 #10
Så prøv

SELECT
  p.id,
  p.accountname
FROM
  players AS p
  friendlist AS f
WHERE
    f.apply = 0
  AND (
      f.id = p.id
    OR
      f.friendid = p.id
  )
  AND (
      f.id = <<<$_SESSION[user_id]>>>
    OR
      p.id = <<<$_SESSION[user_id]>>>
  )


Du skal være OBS på, at da du i

$query2 = mysql_query("SELECT * FROM players AS p, friendlist AS f WHERE f.apply = 0 AND (f.friendid = '$_SESSION[user_id]' OR f.id = '$_SESSION[user_id]') AND (p.id = f.friendid OR p.id = f.id)");

selecter alt (*) fra BEGGE tabeller nok vil få noget rod med id-feltet. Hent derfor KUN hvad du skal bruge.
Avatar billede xsix Nybegynder
03. oktober 2008 - 15:00 #11
Og det med at alle dem der ligger under f.id kommer frem, betyder også at en selv kommer frem på listen.

Hvis man forestiller sig at min database ser sådan her ud:

-----friendlist-----
id | friendid | apply
9 ----- 1 ------- 0
1 ---- 10 ------- 0
4 ----- 1 ------- 1

Så hvis vi siger at mit id er 1, så skal den kun udskrive id'et og navnet for id 9 og 10.
Den eneste grund til at vi også henter players med i query'et, er for at få navnet på de id'er vi har fundet i friendlist.

Håber det giver mere mening nu :)
Avatar billede xsix Nybegynder
03. oktober 2008 - 15:08 #12
Det virker lidt bedre, men der kommer ikke de venner der står på id's plads frem, og ens eget navn kommer ud ligeså mange gange som der er rækker hvor ens eget id står på.
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:13 #13
Jeg skal lige teste lidt så :)
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:23 #14
SELECT
  p.*
FROM
  friendlist AS f,
  players AS p
WHERE
  (
      f.id = 1
    OR
      f.friendid = 1
  )
  AND
    f.apply = 0
  AND
    IF(f.id = 1, f.friendid, f.id) = p.id
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:24 #15
Hov - erstat 1 med session-tingen:

SELECT
  p.id,
  p.accountname
FROM
  friendlist AS f,
  players AS p
WHERE
    f.apply = 0
  AND
  (
      f.id = <<<$_SESSION[user_id]>>>
    OR
      f.friendid = <<<$_SESSION[user_id]>>>
  )
  AND
    IF(f.id = <<<$_SESSION[user_id]>>> f.friendid, f.id) = p.id
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:25 #16
Det lykkedes mig at få det til at virke, men jeg kender intet til effektiviteten af IF()-strukturen :)
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:26 #17
Ah - der skred lige et komma:

SELECT
  p.id,
  p.accountname
FROM
  friendlist AS f,
  players AS p
WHERE
    f.apply = 0
  AND
  (
      f.id = <<<$_SESSION[user_id]>>>
    OR
      f.friendid = <<<$_SESSION[user_id]>>>
  )
  AND
    IF(f.id = <<<$_SESSION[user_id]>>>, f.friendid, f.id) = p.id
Avatar billede xsix Nybegynder
03. oktober 2008 - 15:31 #18
Der manglede lige et komma, men ellers virker det perfekt nu! :D
Tusind tusind mange tak!! Du smider selvfølgelig bare et svar :D
Avatar billede jensgram Nybegynder
03. oktober 2008 - 15:35 #19
Jep - kommaet opdagede jeg også selv, jf. http://www.eksperten.dk/spm/847579#rid7221796
Avatar billede xsix Nybegynder
03. oktober 2008 - 15:41 #20
Hehe ja det så jeg godt efter jeg havde skrevet det.
Ej for fanden hvor er det nice at det virker, det skal du have tusind tak for, har brugt sindsyg lang tid på at få det til at virke, så nu er jeg bare glad :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester