MySQL lekérdezés 2 tábla.

MySQL lekérdezés 2 tábla.
2005-11-13T03:23:07+01:00
2005-11-16T01:19:30+01:00
2022-07-24T06:32:32+02:00
gesslein
Üdvözlet.
Nos, lenne nekem ez a kis részlet...

[...]

function readed($userid, $stid)
{
$result = mysql_query("SELECT * FROM unread WHERE userid = '$userid' AND storyid = '$stid'");
if (mysql_num_rows($result) == 0) $msg = "*";
else $msg = NULL;
return $msg;
}

[...]

$result = mysql_query("SELECT * FROM hirek WHERE catid = '$c' AND status = '1' ORDER BY id DESC LIMIT ".($page*10).",10");
while($row = mysql_fetch_array($result))
{
echo "<a href=\"show.php?".session_name()."=".session_id()."&amp;stid=".$row['id']."&amp;ex=open\">".readed($userid, $row['id']).$row['id'].". ".$row['name']."(".$row['readnum'].")</a><br />";
}

[...]

Ez igy müködik, lényege hogy a linkek hirekre mutatnak, a readed function
pedig annyit tesz hogy a még olvasatlan hirekhez egy csillagot tesz.
Egyszerre 10 link van, lapozhatóan.
Szóval ez igy oké eddig, de ha már sok hír van, akkor elég összevissza
jön ki hogy pl 3 olvasott, alatta 2 olvasatlan, aztán megint pl 4 olvasott
hír van. Tehát, szeretném az olvasatlan, még csillagos hireket elöre hozni
a listázásban. És itt akadok el, mert az ugye külön tábla...
Valakinek ötlet? Köszönöm.
Mutasd a teljes hozzászólást!
Vagy ha SHADOW megoldás nem tetszik, akkor csinálhatod 2 körben is, vagyik amikor abolvasod a dolgokat nem írod ki rögtön, hanem tömbbe teszed, majd a tömböt rendezed, és csak ezután íratod ki a tartalmát.
Jókis tömbrendező föggvényel/egyedi megoldások vannak PHP -ben.
pl: array_sort()
Mutasd a teljes hozzászólást!

  • mysql verzió? Ha 4.1, akkor egy sima subqueryt kell betenni (egy lekérdezést csinálni a kettőből), és aszerint is rendezni.

    4.0ban ha joinolsz rá, szerintem akkor is lehet rendezni az alapján.
    Mutasd a teljes hozzászólást!
  • Vagy ha SHADOW megoldás nem tetszik, akkor csinálhatod 2 körben is, vagyik amikor abolvasod a dolgokat nem írod ki rögtön, hanem tömbbe teszed, majd a tömböt rendezed, és csak ezután íratod ki a tartalmát.
    Jókis tömbrendező föggvényel/egyedi megoldások vannak PHP -ben.
    pl: array_sort()
    Mutasd a teljes hozzászólást!
  • SELECT h.id, h.readnum, h.catid, h.status, count(u.id)
    FROM hirek h
    left join unread u on (u.userid = $userid and u.story.id = h.id)
    group by h.id, h.readnum, h.catid, h.status
    having h.catid = '$c' AND h.status = '1'
    order by 5 desc, h.id DESC

    Szerintem valami hasonló kell neked. A lényeg, hogy megkapod a hirek tábla adatait és a hozzá tartozó unread táblában található mennyiséget (1,0), az order pedig előre veszi azokat amelyek még nem voltak olvasva. Remélem érthető :)
    Mutasd a teljes hozzászólást!
  • A MySQL az 4.1.12.

    ... a hozzá tartozó unread táblában található mennyiséget (1,0)...

    Ezzel az a baj, hogy nincs benne 1,0, hanem a felhasználók azonosítója, és a hír azonositója, tehát ha olvasott egy hírt, akkor ide bekerül user-hir azonosítója (id).
    Ha nem olvasott még el valamit, az nem szerepel ebben a táblában, emiatt ad vissza 0 értéket a mysql_num_rows($result) ilyenkor.

    Emiatt nem tudom azt sem hogy tömbben hogy tudnám rendezni, de töröm magam rajta.
    Mutasd a teljes hozzászólást!
  • Kapcsold össze a kettőt, ahogy feri79 is mondta. (LEFT JOIN)

    A rendezésnél meg próbáld meg a

    ... order isnull(h.status)
    formát.

    Tehát arra a mezőre (remélem ez a h.status, ha nem, akkor te tudod melyikre), ami vagy null (ha még nem olvasta), vagy 1 (ha igen) isnull függvénnyel kérrj rendezést.


    Mutasd a teljes hozzászólást!
  • ...Ezzel az a baj, hogy nincs benne 1,0, hanem a felhasználók azonosítója...

    Azért van az SQL-ben a Count, vagyis a hírhez kapcsolható unread táblában található mezők száma, vagyis ha van a táblában akkor 1, ha nincs akkor 0. (Nem lesz soha NULL)
    A rendezés pedig "order by 5 desc" vagyis az a "Select" után álló 5. elemre csökkenő sorban, tehát azok a hírek lesznek elöl ahová nem lehetett semmit csatolni az unread táblából. Próbáld lefuttatni és nézd meg az eredményt
    Mutasd a teljes hozzászólást!
  • Végülis többdimenziós tömbbel + 2 lekérdezéssel sikerült, az sql-el akárhogy kisérleteztem, sose tetszett neki valami.
    Mutasd a teljes hozzászólást!