Autor | Zpráva | ||
---|---|---|---|
Cakewalk Profil |
#1 · Zasláno: 13. 11. 2011, 18:07:35 · Upravil/a: Cakewalk
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 |
#2 · Zasláno: 13. 11. 2011, 18:14:25
item_watch aw Mimochodem nemáš ošetřený vstup - sessions. |
||
Cakewalk Profil |
#3 · Zasláno: 13. 11. 2011, 18:22:22
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 |
#4 · Zasláno: 13. 11. 2011, 18:28:16
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 |
#5 · Zasláno: 13. 11. 2011, 19:43:16
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 * |
#6 · Zasláno: 13. 11. 2011, 21:04:55
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 |
#7 · Zasláno: 14. 11. 2011, 07:37:14 · Upravil/a: Cakewalk
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 * |
#8 · Zasláno: 14. 11. 2011, 09:00:45
Cakewalk:
Musíte přece počítat stejné spojení s podmínkou, jako v hlavním dotaze. |
||
Cakewalk Profil |
#9 · Zasláno: 14. 11. 2011, 09:10:19
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 * |
#10 · Zasláno: 14. 11. 2011, 09:18:44
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 |
#11 · Zasláno: 14. 11. 2011, 09:31:34
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 * |
#12 · Zasláno: 14. 11. 2011, 09:46:54
Normalizace v relačních databázích je Vám asi cizí.
|
||
Cakewalk Profil |
#13 · Zasláno: 14. 11. 2011, 09:51:25
Krasné teoretické příklady. Upravuji ale systém, který není můj, takže strukturu databáze bych nekritizoval. :)
|
||
Časová prodleva: 12 let
|
0