Avatar billede supermand69 Nybegynder
21. januar 2004 - 16:07 Der er 11 kommentarer og
1 løsning

3 query'er til 1

hej...

kan dette laves på en anden måde så der kun skal køres en query?

<?
foreach($list_arr['list'] as $party_id)
{
    $get = mysql_query("SELECT added, time_start, name, area FROM $DB.party WHERE id=$party_id");
    $row = mysql_fetch_array($get);
   
    if(($TIME - 432000) < $row['added']) $new = '<img src="gfx/party_new.gif">';
    else $new = '&nbsp;';
   
    $get2 = mysql_query("SELECT * FROM $DB.party_music WHERE party_id=$party_id");
    while($row2 = mysql_fetch_array($get2)) $party_music[] = $MUSIC[$row2['music']];
    asort($party_music);
    foreach($party_music as $value) $music .= "$value<br>";
    $music = substr($music, 0, -4);
   
    $get2 = mysql_query("SELECT * FROM $DB.user_party WHERE party_id=$party_id");
    $users = mysql_num_rows($get2);
?>
  <tr valign="top">
    <td class="list" style="padding: 0px; padding-top: 11px;"><?=$new?></td>
    <td class="list" style="padding-left: 0px;"><?=time2date($row['time_start'], 1, 1)?><br><a class="headline" href=""><?=sql2txt($row['name'])?></a><br><?=$AREA[$row['area']]?></td>
    <td class="list"><?=$music?></td>
    <td class="list" align="right"><br><?=$users?></td>
  </tr>
<?
    unset($party_music, $music);
}
?>
Avatar billede gertnissen Nybegynder
21. januar 2004 - 16:12 #1
Måske noget ala

select t1.added, t1.time_start, t1.name, t1.area
    , t2.*
    , t3.*
  from $DB.party t1
    , $DB.party_music t2
    , $DB.user_party t3
where t1.id=$party_id
  and t1.id = t2.party_id
  and t2.party_id = t3.party_id
Avatar billede supermand69 Nybegynder
21. januar 2004 - 16:20 #2
jeg er ikke helt med på join... så gider du ikke pinde det lidt ud?
Avatar billede gertnissen Nybegynder
21. januar 2004 - 16:34 #3
Har du adgang til PHPadmin ? så kan du blot klippe kode ind og erstatte din php var $party_id med en konstant '432'.

Ellers er php koden meget analog til det du selv har lavet i ovenstående

$get = mysql_query("select t1.added, t1.time_start, t1.name, t1.area, t2.*, t3.*
  from $DB.party t1    , $DB.party_music t2    , $DB.user_party t3
where t1.id=$party_id
  and t1.id = t2.party_id
  and t2.party_id = t3.party_id");

Jeg bemærker iøvrigt at du laver en foreach omring dine sql kald, det burde ikke være nødvendigt, erstat istedet t1.id=$party_id med en t1.id in ($party_id1, $party_id2, osv, osv)

Hvis du så også lægger index på id og party_id på dine tabeller vil du formentlig opleve en kæmpe performaceforbedring.
Avatar billede supermand69 Nybegynder
21. januar 2004 - 16:40 #4
grunden til at jeg kører det i en foreach er pga følgende...

function list_sql($sql, $limit, $limit2)
{
    $get = mysql_query($sql);
    $num_rows = mysql_num_rows($get);
   
    $num_page = ceil($num_rows / $limit2);
    $cur_page = ceil($limit / $limit2);
    $cur_page++;
   
    $sql .= " LIMIT $limit, $limit2";
   
    $get = mysql_query($sql);
    while($row = mysql_fetch_array($get)) $list[] = $row['id'];
   
    $list_arr['num_page'] = $num_page;
    $list_arr['cur_page'] = $cur_page;
    $list_arr['list'] = $list;
    return $list_arr;
}
Avatar billede supermand69 Nybegynder
21. januar 2004 - 17:04 #5
ok.. tror jeg er med så langt... men hvordan får jeg så udskrevet musikstil og tilmeldte brugere??
Avatar billede supermand69 Nybegynder
21. januar 2004 - 17:14 #6
altså..??

denne:
&& t_music.party_id = t_user.party_id

er det samme som:
&& t_party.id = t_user.party_id && t_party.id = t_music.party_id
Avatar billede supermand69 Nybegynder
21. januar 2004 - 17:19 #7
ups... mangler lige noget

denne:
t_music.$party_id = t_user.$party_id

er det samme som:
t_party.id = t_user.$party_id && t_party.id = t_music.$party_id
Avatar billede supermand69 Nybegynder
21. januar 2004 - 19:09 #8
hmmm... nu går det da også helt galt... prøver lige igen...

$sql = "SELECT t_party.added, t_party.time_start, t_party.name, t_party.area
    , t_music.music
    , t_user.user_id
    FROM $DB.party t_party
    , $DB.party_music t_music
    , $DB.party_user t_user
    WHERE t_party.id = $party_id
    && t_party.id = t_music.party_id
    && t_music.party_id = t_user.party_id";

det virker ikke helt... kun ved dem som både har noget i

det skal lige siges at det ikke er sikkert at der findes et $party_id i min t_user og t_music... hvis bare en af dem ikke eksisterer kommer der fejl
Avatar billede supermand69 Nybegynder
21. januar 2004 - 21:42 #9
SELECT t_party.id, t_party.name, t_music.music, t_user.user_id
        FROM (test.party t_party LEFT JOIN test.party_music t_music ON t_party.id = t_music.party_id)
        LEFT JOIN test.party_user t_user ON t_party.id = t_user.party_id
        WHERE t_party.id = $party_id
Avatar billede gertnissen Nybegynder
22. januar 2004 - 09:43 #10
Hej igen Supermand69

Det ser ud til at du selv har fundet løsningen - netop ved at bruge left join frem for fuld join.
Avatar billede supermand69 Nybegynder
22. januar 2004 - 12:02 #11
jeg har så bare et lille problem :(

når jeg udskriver hver række skulle det gerne komme til at se således ud:

id | name | music | user_id
1 | fødselsdag | 3,4,5,2 | 60

music skal laves til et array og der skal laves en count() på user_id?? kan bare ikke lige hitte ud af det...
Avatar billede supermand69 Nybegynder
26. januar 2004 - 11:42 #12
lukker...
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
Computerworld tilbyder specialiserede kurser i database-management

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

IT-JOB