webForumDet fria alternativet

Kombinera flertal MySQL satser till en

Databaser & SQL

5 svar · 871 visningar · startad av Gimbo

Medlem sedan dec. 20001 626 inlägg
Frågan#1

Tjena,

Håller på att utveckla ett PHP skript till ett iPhone spel och använder MySQL för att utföra en rad olika SELECT-satser, men jag har nu snabbt knackat mig in i ett hörn.. Jag sitter här nu med flera ineffektiva SELECT-satser som är beroende utav varandra. T ex om jag ska plocka ut motståndarens användarnamn ur users så måste jag gå den här omvägen för att slutligen få det jag behöver:

$results = mysql_query("SELECT id FROM users WHERE username='anvandare'");
while ($row = mysql_fetch_array($results)) {
    $userid = $row["id"];
}

$results = mysql_query("SELECT id FROM allGames WHERE userid='".$userid."'");
while ($row = mysql_fetch_array($results)) {
    $gameid = $row["id"];
}

$results = mysql_query("SELECT userid FROM allGames WHERE userid!='".$userid." AND id='".$gameid."'");
while ($row = mysql_fetch_array($results)) {
    $opponentid = $row["userid"];
}

$results = mysql_query("SELECT username FROM users WHERE id='".$opponentid."'");
while ($row = mysql_fetch_array($results)) {
    $opponent = $row["username"];
}

Appen skickar alltså användarens username till skriptet, som sedan måste köra 4 st SELECT-satser för att få motståndarens användarnamn. Detta snippet är bara en del utav en mängd likadana SQL-satser..

Är det möjligt att på något sätt effektivisera det hela? Och begränsa mängden SQL satser?

Oerhört tacksam för,
Gimbo

Medlem sedan dec. 2009872 inlägg
#2

1. Jag vet inte om du har tillgång till Access? Men i Access kan man skapa frågor via att klicka sig fram i olika menyer. Sen kan man få ut SQL koden som dessa klick har genererat.

Det finns säkert även i andra program och gränssnitt.
Det kan vara en bra hjälp på vägen, även om koden som genereras sällan är den mest optimala.

2. "SELECT p.strName AS parent_strName, c.strName AS child_strName from [CHILDREN] c LEFT JOIN [PARENT] p on c.intParentID = p.intID order by c.intID, p.intID"

Detta är en modifierad kod från ett annat sammanhang som likar det du beskriver. (Om jag nu inte råkar blanda på PARENT och CHILDREN.)
Loop1: SELECT intID FROM [PARENT]
Loop2: SELECT intID FROM[CHILDREN] WHERE intParentID = p.intID

Ja... jag vet inte om det hjälper dig åt rätt håll, men du kanske kan pussla vidare på det sätt som ditt problem lutar åt?

Medlem sedan dec. 2009872 inlägg
#3

Ja, men nu uppdaterar du ju mitt i natten!! :-)

Din databas är felkostruerad:

[users]
intID
strUsername

[allGames]
intID
intGamerID <--- spelaren
intOpponentID <--- motståndaren

***
Lista alla spel:
SELECT a.intID, u.strUsername As strGamer, u.strUsername As strOpponent FROM [allGames] a, [users] u WHERE a.intGamerID = u.intID AND a.intOpponentID = u.intID ORDER BY a.intID

Notering: [allGames] borde heta [games]

Jag har aldrig plockat två ID från samma tabell på det viset. Det kanske inte fungerar??
Hur som helst så tror jag det blir mindre skriverier för dig om du gör databasen som jag beskriver ovan.

Hur ser din ut? Jag har ju bara gissat...!!

Medlem sedan juli 2004144 inlägg
#4

Left join...

Medlem sedan mars 20034 471 inlägg
#5

Så här får du ut allt på en gång:

$sql = 

"-- De tre första kolumnerna i SELECT kan tas bort 
-- om du bara vill ha ut motståndarens användarnamn
SELECT 
   P.id as PlayerID,    
   G.id as GameID,
   O.id as OpponentID,
   OU.username
FROM 
   users P 
   INNER JOIN allGames G ON 
      P.id = G.userid
   INNER JOIN allGames O ON 
      G.id = O.id AND 
      P.id <> O.userid  
   INNER JOIN users OU ON
      O.id = OU.id 
WHERE 
   P.username='anvandare' "

$results = mysql_query($sql);
while ($row = mysql_fetch_array($results)) {
    $opponent = $row["username"];
}

civilpolisen - Det är lite farligt att föreslå hur någons tabellstruktur bör se ut om man inte vet något om hur den är tänkt att fungera. Det kanske finns flera opponents till varje game i Gimbos struktur? Då funkar inte ditt förslag.

Dock undrar jag också Gimbo varför inte kolumnen med namnet id i allGames är unik? Det är en lite konstig namngivning åtminstonde eftersom man just brukar låta namnet id sitta på PRIMARY KEYs eller andra unika fält. Om allGames är en relationstabell som knyter ihop spelare med spel så kan man ge båda ingående id-nycklar förklarande tillägg i den nya kolumnen tex:
(GameID, UserID, ....) hellre än (id, UserID, ...) eftersom det senare får folk att tro att id är unik i den här tabellen (allGames).

Medlem sedan dec. 2009872 inlägg
#6

Hur ser din ut? Jag har ju bara gissat...!!

Låt mig citera mig själv då jag tydligen inte var tydlig nog.

Det är så underhållande med folk som läser delar av ett inlägg och svarar som en byfåne! Det händer ofta på detta forumet!

Du är i gott sällskap!! :-)

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)