ugrás a tartalomhoz

Két while ciklus egymásba ágyazva SQL lekérdezésekkel

Anonymous · 2006. Aug. 22. (K), 22.59
Akadt egy kis gond a while ciklusal. Probaltam megoldani de nem sikerult, ezert a forumhoz fordulok!

A kovetkezo mySQL query kap adatokat amelyeket egy HTML tablaban akarok kilistazni.

$data = mysql_query("SELECT messages.id, messages.exped, messages.subiect, messages.send_date FROM messages LEFT JOIN pm ON (messages.id = pm.msg_id AND messages.uid = '".$_SESSION['uid']."') WHERE pm.folderid = '".$folderid."'");
a kovetkezo kepen mukodik a dolog:

while ($row = mysql_fetch_array($data)) {

print "<tr id=\"check_{$row['id']}\">
    <td><input type=\"checkbox\" name=\"list[]\" value=\"{$row['id']}\" onClick=\"highlight(this,'check_{$row['id']}')\" /></td>
    <td><a href=\"?do=showpm&message={$row['id']}\">{$row['username']}</a></td> 
    <td><a href=\"?do=showpm&message={$row['id']}\">{$row['subiect']}</a></td>
    <td>{$row['send_date']}</td>
    </tr>";
}
A kodot fejbol gepeltem be ezert ha elfelejtettem egy pontos veszot akkor elnezest kerek, de gondolom a lenyeg benne van.

A gond az, hogy a $row['username'] adatokat mas tablabol kene kiszedjem.
Ezert letrehoztam meg egy mysql queryt:

$row_username = mysql_query("SELECT register.username FROM register LEFT JOIN messages ON register.user_id = messages.uid LEFT JOIN pm ON messages.id = pm.msg_id WHERE pm.folderid = '-1'");
Probaltam a kovetkezo keppen elinditani a kodot:

while ($row = mysql_fetch_array($data)) {

print "<tr id=\"check_{$row['id']}\">
    <td><input type=\"checkbox\" name=\"list[]\" value=\"{$row['id']}\" onClick=\"highlight(this,'check_{$row['id']}')\" /></td>
    <td><a 

    while ($row2 = mysql_fetch_array($row_username)) {
    print "<td><a href=\"?do=showpm&message={$row['id']}\">{$row2['username']}</a></td>";
}
    print "<td><a href=\"?do=showpm&message={$row['id']}\">{$row['subiect']}</a></td>
    <td>{$row['send_date']}</td>
    </tr>";
}
Szoval az a gond jelentkezik, hogy nem paszolnak ossze az adatok. Azt szeretnem elerni, hogy kilistaza az osszes sort a kovetkezo formaban:

$row['id'] | $row2['username'] | $row['subiect']
$row['id'] | $row2['username'] | $row['subiect']
$row['id'] | $row2['username'] | $row['subiect']
Azt hsizem jelenleg a $row2['username'] kilistaza az osszes adatot ami a tablaban van, es egyenkent kene. De nem vagyok biztos.

Tudna valaki segiteni?

Koszonom
 
1

session?

breakline · 2006. Aug. 23. (Sze), 09.33
Akkor itt egy konkrét felhasználó üzeneteit listázod?
Ha a felhasználó felhasználóneve kell, akkor azt le tudod kérdezni, nem? Az első lekérdezés alapján csak azokat az üzeneteket kérdezed le, amik egy felhasználóhoz tartoznak, akkor:

$row_username = mysql_query("SELECT register.username FROM WHERE register.user_id = ".$_SESSION['uid']."");

vagy az elsőbe minden sorba beteheted hasonlót egy JOIN-nal, akkor nem kell két lekérés

Bl
2

mySQL

Anonymous · 2006. Aug. 23. (Sze), 09.56
A mysql lekeres mukodik jol, semmi gond vele.
Meg kapom a usereket a kovetkezo formaba:

user1
user2
user3

Ezeket kene beszurjam a fenti kodba a $row['username'] helyebe. Sajnos nem hasznalhatom a $row['username']-t mert masik tablabol kapom meg az adatokat, ezert ezt csinaltam :

while ($row = mysql_fetch_array($data)) {

print "<tr id=\"check_{$row['id']}\">
    <td><input type=\"checkbox\" name=\"list[]\" value=\"{$row['id']}\" onClick=\"highlight(this,'check_{$row['id']}')\" /></td>";

    while ($row2 = mysql_fetch_array($sent)) {
    print "\n<td><a href=\"?do=showpm&message={$row['id']}\">{$row2['username']}</a></td></tr>";
    }

   print " <td><a href=\"?do=showpm&message={$row['id']}\">{$row['subiect']}</a></td>
    <td>{$row['send_date']}</td>
    </tr>";

}
Latszik a masodik while hasznalata.
Most a kovetkezo HTML kodot kapom ami helytelen:

</tr><tr id="check_123">
    <td><input type="checkbox" name="list[]" value="123" onClick="highlight(this,'check_123')" /></td>

<td><a href="?do=showpm&message=123">user1</a></td></tr>
<td><a href="?do=showpm&message=123">user2</a></td></tr>
<td><a href="?do=showpm&message=123">user3</a></td></tr>

<td><a href="?do=showpm&message=123">message subject</a></td>
<td>2006-08-22 16:04:12</td>
es nekem valami hasonlo kene :

</tr><tr id="check_123">
    <td><input type="checkbox" name="list[]" value="123" onClick="highlight(this,'check_123')" /></td>

<td><a href="?do=showpm&message=123">user1</a></td></tr>

<td><a href="?do=showpm&message=123">message subject</a></td>
<td>2006-08-22 16:04:12</td>
A masodik While beszurja az osszes adatot amit tartalmaz, nem tudja egyeztetni az elso while-val, hogy szepen egyenkent rakjak be az adatokat.

Azert hoztam fel a fenti peldat:

$row['id'] | $row2['username'] | $row['subiect']
$row['id'] | $row2['username'] | $row['subiect']
$row['id'] | $row2['username'] | $row['subiect']
mert a $row az elso while, a $row2 a masodik.
Szepen kene jojennek az adatok egymas utan.

Ha tudtok segiteni halas lennek, mert tegnap ota keresek valaszt, es lehet, hogy egy egyszeru dolog csak en nem tudok rajonni.

Kosz !
3

Hozaszolas

Anonymous · 2006. Aug. 23. (Sze), 10.04
Azt is megemlitenem a fenti hozaszolasomhoz, hogy ha a mysql tabla csak egy usert tartalmaz

user1

akkor minden jol latszik, valoszinuleg azert, mert mas usereket nem tud a masodik while beszurni.
4

akkor while-ban változtass

breakline · 2006. Aug. 23. (Sze), 10.12
Akkor gondolom ez valami fórum, ahol lekérdezed a felhasználó privát üzeneteit, és neked az a felhasználónév kell, aki az adott üzenetet kapta.(?)

Egyébként ez a lekérdezés:
$row_username = mysql_query("SELECT register.username FROM register LEFT JOIN messages ON register.user_id = messages.uid LEFT JOIN pm ON messages.id = pm.msg_id WHERE pm.folderid = '-1'");

azért nem jó, mert kéne egy olyan adat, amitől függjön, h. minden while lefutással (az első while) az adott sorhoz tartozó adatot kapjad

$row_username = mysql_query("SELECT register.username FROM register LEFT JOIN messages ON (register.user_id = messages.uid AND messages.ID=".$row['id'].") LEFT JOIN pm ON messages.id = pm.msg_id WHERE pm.folderid = '-1'");
Ekkor ezt minden while-on belül meg kell adnod, így mindig az aktuális rekordhoz kérdezi le.

már ha ezt akarod csinálni.:)

Bl
5

kosz

Anonymous · 2006. Aug. 23. (Sze), 11.27
Akkor gondolom ez valami fórum, ahol lekérdezed a felhasználó privát üzeneteit, és neked az a felhasználónév kell, aki az adott üzenetet kapta.(?)

Igen, privat uzenetekre hasznalom.

Koszonom a segitseget ! Mukodik a dolog.

Ha a mysql query sokszor lefut nem lasitja az oldalt? Mondjuk en meg fogom szabni, hogy csak 20-30 uzenet legyen kilistazva az oldalon.