[PHP/MySQL] Sortera data från två tabeller

Permalänk
Medlem

[PHP/MySQL] Sortera data från två tabeller

Tjena!

Sysslar med ett litet webbspel kan man väl kalla det. Men har stött på ett problem, eller snarare en frågeställning.
Jag vill lista vilka teams som finns och vilka medlemmar som ingår i dem. Just nu har jag två tabeller för att lagra datan:

Tabell: teams
Kolumner: name, lvl, accept_users

Tabell: users_teams_matches
Kolumner: username, teamname

Jag vill alltså presentera all data från dessa tabeller på detta sätt:

teams[name1] - teams[lvl] - teams[accept_users]

--- user_teams_matches[teamname1][username1]
--- user_teams_matches[teamname1][username2]

teams[name2] - teams[lvl] - teams[accept_users]

--- user_teams_matches[teamname2][username3]
--- user_teams_matches[teamname2][username4]

etc, etc. Hoppas ni förstår vad jag menar.

Jag anar att det är lite onödigt att köra MySQL-frågor i en loop. T. ex:

while ($teams = $resultteams->fetch_assoc()) { echo $teams['name']; $query_users = "SELECT username FROM users_teams_matches WHERE teamname =".$teams['name']; $resultusers = $mysqli->query($query_users); while ($users = $resultusers->fetch_assoc()) { echo $users['username']; } }

Kan väl inte vara en vettig idé med så många querys när jag ändå ska hämta all data från tabellerna i slutändan?

Tänkte om jag skulle göra på detta sätt istället:

$query = "SELECT name, lvl, accept_users FROM teams ORDER BY lvl"; $query2 = "SELECT username, teamname FROM users_teams_matches"; $resteams = $mysqli->query($query); $resusers = $mysqli->query($query2); while ($teams = $resteams->fetch_assoc()) { echo $teams['name']; while ($users = $resusers->fetch_assoc()) { if ($users['teamname'] == $teams['name']) { echo $users['username']; } } }

Skulle det senare alternativet innebära en mindre belastning på servern? Vilket tycker ni är smidigast, har ni något annat sätt kanske?
Anledningen till att jag valt att lagra datan på detta vis i dessa tabeller är att det skulle vara smidigt för kommande funktionaliteter.

(Vet att koden i sig är bristfällig, slängde bara ihop två exempel.)

Tack på förhand!
Mvh, Xburk.

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

edit: För tidigt på morgonen.

Jag kollade på vad du egentligen ville ha en gång till och det blir som minst två queries. Ditt andra exempel kommer nästan garanterat att vara snabbare eftersom du bara ställer två queries, men du kommer ha en större mängd data i minnet. Det bör inte vara något problem.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Du bör alltid använda dig utav en limit på queryn.
Sedan så kan du använda dig utav en LEFT OUTER JOIN in din första query

Kan tyvärr inte ge dig något exempel, då tiden rinner iväg. Men testa en join.

Permalänk
Medlem

Något i stil med detta borde funka, var ett tag sen jag jobbade med MySQL och koden är inte testad. Men du fattar poängen.

select t.name, u.* from users_teams_matches u inner join teams t on t.name = u.teamname order by t.lvl

Sen borde du ha ett ID i varje tabell och använda det för att joina, typ

select t.name, u.* from users_teams_matches u inner join teams t on t.id = u.teamid order by t.lvl

Visa signatur

CPU: Intel Xeon E5-2620v3 (6x2.4 GHz) RAM: 16GB (4x4GB) 2133 MHz DDR4 ECC
GPU: EVGA GeForce GTX 970 4GB Chassi: Dell Precision Tower 7910, 1300W (v2)

Permalänk
Medlem
Skrivet av nikwad:

Du bör alltid använda dig utav en limit på queryn.
Sedan så kan du använda dig utav en LEFT OUTER JOIN in din första query

Kan tyvärr inte ge dig något exempel, då tiden rinner iväg. Men testa en join.

Skrivet av Weno:

Något i stil med detta borde funka, var ett tag sen jag jobbade med MySQL och koden är inte testad. Men du fattar poängen.

select t.name, u.* from users_teams_matches u inner join teams t on t.name = u.teamname order by t.lvl

Sen borde du ha ett ID i varje tabell och använda det för att joina, typ

select t.name, u.* from users_teams_matches u inner join teams t on t.id = u.teamid order by t.lvl

Har inte jobbat med sidan på ett tag, därav det sena svaret. Tack så mycket för hjälpen, ska köra med JOIN!

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail