Autor Zpráva
Cakewalk
Profil
Dobrý den,
uměl by někdo poradit? Mám dvě tabulky v databázi: item a item_watch
item obsahuje - item_id, item_name, owner_id, atd. (zbytek nepodstatný)
item_watch obsahuje - user_id, item_id

Jde o to, že když zboží dám sledovat, tak v uživatelském rozhraní vidím seznam zboží, které sleduji.
Načítám to takto:

$sql_select_items = $db->query("SELECT iw.*, i.name, i.end_time FROM " . DB_PREFIX . "item_watch iw
					LEFT JOIN " . DB_PREFIX . "item i ON i.item_id=iw.item_id
					WHERE iw.user_id='" . $session->value('user_id') . "'
					ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit);

Bezproblémů funguje.

Když chci ale zobrazit všechno moje zboží, které je sledováno jinými uživateli, tak se nic nezobrazí.
Načítám to takto:

$sql_select_items = $db->query("SELECT iw.*, i.name, i.end_time FROM " . DB_PREFIX . "item_watch aw
					LEFT JOIN " . DB_PREFIX . "item i ON i.item_id=iw.item_id
					WHERE i.owner_id='" . $session->value('user_id') . "'
					ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit);

Bude chyba asi v LEFT JOIN, ale netuším kde. Mělo by to porovnat obě tabulky a vytáhnout všechno zboží z item_watch, které mají stejné owner_id v tabulce item.

Díky za všechny nápady.
joe
Profil
item_watch aw


Mimochodem nemáš ošetřený vstup - sessions.
Cakewalk
Profil
Jo to jsem blbě opsal. Mám tam item_watch iw. Sessions má vyřešený víše a funguje. Vzhledem k tomu, že první načítání funguje bez problémů, řekl bych, že budu někde chyba v tom porovnávání tabulek.
joe
Profil
Co ti to píše za chybu?
Proč máš čísla v apostrofech?
Co kdybys sem rovnou dal přímo dotaz, který se posílá do db (tzn. bez proměnných).

Teď si nevšímám žádné další chyby.
Cakewalk
Profil
No chybu to nepíše žádnou, ale už jsem to vyřešil. Měl jsem to v podmínce a nevšimnul jsem si, že se mi to načítá dvakrát. Sice mi to teď píše v hlavičce počet všeho zboží místo jen toho, co je sledované, ale to snad nějak pořeším. Díky za rady, občas potřebuju nakopnout.
Kajman_
Profil *
Cakewalk:
všeho zboží místo jen toho, co je sledované

To bude tím left joinem, smažte left a mělo by to být (s tím, že můžete vidět jedno zboží vícekrát, pokud ho sleduje více uživatelů).
Cakewalk
Profil
To je v pořádku. Zboží musím vidět v seznamu např. šestkrát, pokud ho sleduje šest uživatelů. Spíše mi to do seznamu načte veškeré zboží uživatele. I to nesledované. Zobrazí to sice jen ty vyfiltrované, ale informace o počtu uvání číslo všeho zboží a stránka má tendenci nabídnout přeskakování na další stránku, jako by tam bylo v seznamu více jak deset položek. Snad to dobře vysvětluju;)

Bude to tímto:
Tímto filtruji zobrazené zboží a to už funguje.
if ($nb_items)
			{
$sql_select_items = $db->query("SELECT iw.*, i.name, i.end_time FROM " . DB_PREFIX . "item_watch iw
					LEFT JOIN " . DB_PREFIX . "item i ON i.item_id=iw.item_id
					WHERE i.owner_id='" . $session->value('user_id') . "'
					ORDER BY " . $order_field . " " . $order_type . " LIMIT " . $start . ", " . $limit);


Nad tímto mám.

$nb_items = $db->count_rows('item', "WHERE owner_id='" . $session->value('user_id') . "'");


V tomto bude problém. Protože načítám všechno. Nějak to musím pořešit. Ale díky za reakci.
Kajman_
Profil *
Cakewalk:
Musíte přece počítat stejné spojení s podmínkou, jako v hlavním dotaze.
Cakewalk
Profil
Hlavní dotaz je již upraven. Původní byl:

$nb_items = $db->count_rows('item_watch', "WHERE user_id='" . $session->value('user_id') . "'");


Jenže pak se nezobrazilo vůbec nic. Asi by bylo jednoduší přidat do tabulky item_watch položku owner_id a pak by to velmi jenoduché načítání. Asi to tak udělám. Jiné východisko nevidím.
Kajman_
Profil *
Neznám db layer, který používáte, ale určitě můžete použít i obyčejné query, pokud count_rows spojení nepodporuje...

SELECT count(*) pocet_radku
FROM   item_watch iw
JOIN   item i
ON     i.item_id = iw.item_id
WHERE  i.owner_id = 42
Cakewalk
Profil
Díky za radu, vyřešil jsem to zcela jednoduše. Přidal jsem do tabulky item_watch položku owner_id a pouze v dotazu vyfiltroval zboží podle čísla owner_id. Proč to dělat jednoduše, když to jde složitě;) Díky za rady.
Kajman_
Profil *
Normalizace v relačních databázích je Vám asi cizí.
Cakewalk
Profil
Krasné teoretické příklady. Upravuji ale systém, který není můj, takže strukturu databáze bych nekritizoval. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0