webForum webForum sponsras med lina och serverplats av Binero AB

Gå tillbaka   webForum > Utveckling > Programmering & Utveckling > Databashanterare & SQL

Databashanterare & SQL Diskussioner om databashanterare och SQL. Exempelvis DML, DDL, MySQL, MS SQL Server samt datamodellering.

Svar
 
Trådverktyg Visningsalternativ
Äldre 2012-06-06, 01:25   #1
Gimbo
Medlem
 
Registrerad: 2000-12-16
Ort: Stockholm
Inlägg: 1 625
Lösningar: 0
Kombinera flertal MySQL satser till en

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:

PHP-kod:
$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
__________________
J.Kerkinni en grymt bra Mode Blogg

Senast redigerad av Gimbo, 2012-06-06 klockan 01:44
Gimbo besöker inte forumet just nu   Svara med citat
Äldre 2012-06-06, 01:47   #2
civilpolisen
Medlem
 
civilpolisens avatar
 
Registrerad: 2009-12-10
Ort: Bangalore
Inlägg: 816
Lösningar: 11
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?
civilpolisen besöker inte forumet just nu   Svara med citat
Äldre 2012-06-06, 02:00   #3
civilpolisen
Medlem
 
civilpolisens avatar
 
Registrerad: 2009-12-10
Ort: Bangalore
Inlägg: 816
Lösningar: 11
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...!!
civilpolisen besöker inte forumet just nu   Svara med citat
Äldre 2012-06-06, 07:57   #4
walter groupius
Medlem
 
Registrerad: 2004-07-30
Inlägg: 227
Lösningar: 0
Left join...
walter groupius besöker inte forumet just nu   Svara med citat
Äldre 2012-06-07, 23:56   #5
aasah
Medlem
 
Registrerad: 2003-03-16
Ort: Stockholm
Inlägg: 3 377
Lösningar: 64
Så här får du ut allt på en gång:

PHP-kod:
$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).
aasah besöker inte forumet just nu   Svara med citat
Äldre 2012-06-08, 10:27   #6
civilpolisen
Medlem
 
civilpolisens avatar
 
Registrerad: 2009-12-10
Ort: Bangalore
Inlägg: 816
Lösningar: 11
Citat:
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!! :-)
civilpolisen besöker inte forumet just nu   Svara med citat
Svar
webForum > Utveckling > Programmering & Utveckling > Databashanterare & SQL

Trådverktyg
Visningsalternativ

Forumregler
Du får inte posta nya trådar
Du får inte posta svar
Du får inte bifoga filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är av
HTML-kod är av

Forumhopp


Alla tider är i GMT +1. Klockan är nu 19:56.


Powered by: vBulletin Version 3.8.6
Copyright © webForum