Autor | Zpráva | ||
---|---|---|---|
SkIpPeR Profil |
#1 · Zasláno: 13. 12. 2010, 21:00:19
Dobrý den, doufám že nezdržuji zbytečným dotazem, ale nedávno jsem začal budovat svůj vlastní kód fora, celé forum jako takové funguje parádně, ale poprvé jsem se dostal k vyhledávání, tak jsem se chtěl zeptat jakého jste názoru, ohledně vyhledávání na foru, to je moje první otázka, já zvolil fulltext, ale mám problém že když uživatel zadá nějaký hledaný výraz, tak bych potřeboval vybírat z tabulky kde jsou jednotlivá témata, ale také z tabulky kde jsou příspěvky do těchto témat:
$result = mysql_query(" SELECT * FROM f_topics, f_posts WHERE MATCH(nazev) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(text) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY 5 * MATCH(nazev) AGAINST ('$search') + MATCH(text) AGAINST ('$search') DESC ") or die ("Hledaný výraz nenalezen!"); mně nefunguje, nevíte jak se toto dá vyřešit? |
||
Kajman_ Profil * |
#2 · Zasláno: 14. 12. 2010, 09:09:41
Co vypíše mysql_error?
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=37836#chyba |
||
SkIpPeR Profil |
#3 · Zasláno: 14. 12. 2010, 12:40:57
Kajman:
Column 'nazev' in where clause is ambiguous Jakože sloupec 'nazev' není jednoznačný, jak to udělat aby byl prosím? |
||
__construct Profil |
#4 · Zasláno: 14. 12. 2010, 12:50:25
SkIpPeR:
Musíš do dotazu špecifikovať z ktorej tabuľky sa má stĺpec nazev brať do úvahy - napr. takto:
… WHERE MATCH(`f_topics`.`nazev`) AGAINST … |
||
SkIpPeR Profil |
#5 · Zasláno: 14. 12. 2010, 13:19:53
Ok, to už vypadá dobře, ale jak potom zjistim jestli to vybralo z tabulky f_topics nebo f _posts? ... protože potom při while ještě u každého výsledku vybírám z tabulky f_forums ... ale ve f_posts nemám uložený id toho f_forums, takže musim jít přes tabulku f_topics.
Doufám že to vysvětluju správně |
||
Kajman_ Profil * |
#6 · Zasláno: 14. 12. 2010, 14:40:30
Tak si nedávejte select *, ale jen sloupce, které chcete a u těch, co by kolidovaly, si můžete definovat alias.
select `f_topics`.`nazev` as topic_nazev, `f_posts`.`nazev` as posts_nazev ... |
||
SkIpPeR Profil |
#7 · Zasláno: 14. 12. 2010, 17:08:22 · Upravil/a: SkIpPeR
Tak jsem to upravil na následující:
$result = mysql_query(" SELECT `f_topics`.`id` as topic_id, `f_topics`.`nazev` as topic_nazev, `f_topics`.`forum` as topic_forum, `f_topics`.`user` as topic_user, `f_topics`.`text` as topic_text, `f_topics`.`datum` as topic_datum, `f_topics`.`cas` as topic_cas, `f_posts`.`id` as post_id, `f_posts`.`nazev` as post_nazev, `f_posts`.`topic` as post_topic, `f_posts`.`user` as post_user, `f_posts`.`text` as post_text, `f_posts`.`datum` as post_datum, `f_posts`.`cas` as post_cas FROM f_topics, f_posts WHERE MATCH(`f_topics`.`nazev`) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(`f_topics`.`text`) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(`f_posts`.`nazev`) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(`f_posts`.`text`) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY 5 * MATCH(`f_topics`.`nazev`) AGAINST ('$search') + MATCH(`f_posts`.`nazev`) AGAINST ('$search') + MATCH(`f_topics`.`text`) AGAINST ('$search') + MATCH(`f_posts`.`text`) AGAINST ('$search') DESC "); Ale mám problém že mi to vypíše akorát obsah tabulky f_posts pokud vyhledám nějaký název topicu nebo postu. Kód mám následující: $pocet=mysql_num_rows($result); while($result2=mysql_fetch_array($result)){ if(!$result2['post_id']){ $f_forum_db=mysql_query("select * from `f_forum` where `id` = ".$result2['topic_forum'].""); $f_forum_write=mysql_fetch_array($f_forum_db); $f_categories_db=mysql_query("select * from `f_categories` where `id` = ".$f_forum_write['category'].""); $f_categories_write=mysql_fetch_array($f_categories_db); if($f_categories_write['prava']<4){ if($_SESSION['prava']>=$f_categories_write['prava']){ echo "<tr><td class=\"f_text\"><a href='index.php?page=viewtopic&t=".$result2['topic_id']."'><span class='f_category_nadpis'>".$result2['topic_nazev']."</span><br>".$result2['topic_text']."</a></td></tr>"; } else echo "Pro daný výraz nebylo nic nalezeno!";} else { echo "<tr><td class=\"f_text\"><a href='index.php?page=viewtopic&t=".$result2['topic_id']."'><span class='f_category_nadpis'>".$result2['topic_nazev']."</span><br>".$result2['topic_text']."</a></td></tr>"; } } else { $f_topic_db=mysql_query("select * from `f_topics` where `id` = ".$result2['post_topic']." "); $f_topic_write=mysql_fetch_array($f_topic_db); $f_forum_db=mysql_query("select * from `f_forum` where `id` = ".$f_topic_write['forum'].""); $f_forum_write=mysql_fetch_array($f_forum_db); $f_categories_db=mysql_query("select * from `f_categories` where `id` = ".$f_forum_write['category'].""); $f_categories_write=mysql_fetch_array($f_categories_db); if($f_categories_write['prava']<4){ if($_SESSION['prava']>=$f_categories_write['prava']){ echo "<tr><td class=\"f_text\"><a href='index.php?page=viewtopic&t=".$f_topic_write['id']."'><span class='f_category_nadpis'>".$result2['post_nazev']."</span><br>".$result2['post_text']."</a></td></tr>"; } else echo "Pro daný výraz nebylo nic nalezeno!";} else { echo "<tr><td class=\"f_text\"><a href='index.php?page=viewtopic&t=".$f_topic_write['id']."'><span class='f_category_nadpis'>".$result2['post_nazev']."</span><br>".$result2['post_text']."</a></td></tr>"; } } } |
||
Kajman_ Profil * |
#8 · Zasláno: 14. 12. 2010, 19:19:27
Podle barviček máte špatně uvozovky hned na čtvrtém řádku. Moc jsem to nečetl, ale vypadá to, že jste špatně nastudoval nebo pochopil relační možnosti databází.
|
||
SkIpPeR Profil |
#9 · Zasláno: 14. 12. 2010, 19:22:45
Kajman:
Opraveno, špatně opsáno. Moc nechápu druhou větu. |
||
Kajman_ Profil * |
#10 · Zasláno: 15. 12. 2010, 09:06:15
SkIpPeR:
„mám problém že mi to vypíše akorát obsah tabulky f_posts“ Asi je nesmyslná podmínka pro určení, zda chcete vypsat topic nebo post. !$result2['post_id'] skočí na tom cross joinu bez vazební podmínky vždy do else „Moc nechápu druhou větu.“ Já zase nechápu proč ve while děláte pro každý nalezený řádek dva až tři další dotazy (které stejně ani nevyužijete). Takovéto plýtvání výkonem jste viděl v jaké literatuře? Kapitoly o relačním pojedí databází a o příkazu join tam nebyly? Ty by totiž pomohly navíc opravit i ten vyhledávací dotaz, aby se nenásobily řádky nalezených topiců s řádky nalezených postů. |
||
SkIpPeR Profil |
#11 · Zasláno: 15. 12. 2010, 16:19:39 · Upravil/a: SkIpPeR
Kajman:
Na tak vysoké urovni zase MySQL neumím, bohužel studuju to jen z návodů a z databáze téhle diskuse EDIT: Tak jsem to trochu poupravil, ale nefunguje to, o JOIN toho tolik nevím $result = mysql_query(" SELECT `f_topics`.`id` as topic_id, `f_topics`.`nazev` as topic_nazev, `f_topics`.`forum` as topic_forum, `f_topics`.`user` as topic_user, `f_topics`.`text` as topic_text, `f_topics`.`datum` as topic_datum, `f_topics`.`cas` as topic_cas, `f_posts`.`id` as post_id, `f_posts`.`nazev` as post_nazev, `f_posts`.`topic` as post_topic, `f_posts`.`user` as post_user, `f_posts`.`text` as post_text, `f_posts`.`datum` as post_datum, `f_posts`.`cas` as post_cas FROM f_topics INNER JOIN f_posts ON `f_posts`.`topic`=`f_topics`.`id` AND MATCH(`f_posts`.`nazev`) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(`f_posts`.`text`) AGAINST ('$search' IN BOOLEAN MODE) WHERE MATCH(`f_topics`.`nazev`) AGAINST ('$search' IN BOOLEAN MODE) OR MATCH(`f_topics`.`text`) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY 5 * MATCH(`f_topics`.`nazev`) AGAINST ('$search') + MATCH(`f_posts`.`nazev`) AGAINST ('$search') + MATCH(`f_topics`.`text`) AGAINST ('$search') + MATCH(`f_posts`.`text`) AGAINST ('$search') DESC ") or die ("Hledaný výraz nenalezen!<br>".mysql_error()); Píše že to nic nenašlo, ale až při výpisu mysql_fetch_array() výše zmíněného kódu |
||
Kajman_ Profil * |
#12 · Zasláno: 15. 12. 2010, 23:15:03
Píše že to nic nenašlo
To by mohlo být tím, že syntaxi máte dobře (nepadne to do die), ale prostě těm podmínkám, co jste vyplodil, žádný řádek nevyhovuje. o JOIN toho tolik nevím Join si určitě nastudujte. Pokud se o něm Vámi vybrané návody nezmiňují, nestojí za čtení. Můžete využít i dokumentaci, když na to slovo join v kódu kliknete. |
||
SkIpPeR Profil |
#13 · Zasláno: 16. 12. 2010, 21:00:51
Kajman:
A dalo by se to nějak upravit, aby při tom selectu se vybrali z tabulky f_topics vyhovující topiky a z tabulky f_posts vyhovující příspěvky a pak ve while aby se to spojilo do jednoho, kdybych to potom chtěl vypsat, tak by se nerozlišovalo jestli to je post nebo topic ale bylo by tam třeba jen $row['id']; a $row['nazev']; Stejně tak potom potřebuju, aby se nezobrazovali výsledky které jsou v částech fora, které nejsou přístupné uživatelům s určitými právy ... tyto topiky a posty maj však definována práva v tabulce kategorii (f_categories) Pomužete mi s tím prosím? |
||
Časová prodleva: 4 dny
|
|||
SkIpPeR Profil |
#14 · Zasláno: 20. 12. 2010, 15:50:04
Prosím, mužete mi někdo pomoci, mám šibeniční termín do pátku :(
|
||
SkIpPeR Profil |
#15 · Zasláno: 21. 12. 2010, 18:35:52
Vypadá to, že je dotaz špatně, i když je hledaný výraz určitě v databázi, tak potom
$pocet=mysql_num_rows($result); |
||
Časová prodleva: 11 dní
|
|||
SkIpPeR Profil |
#16 · Zasláno: 1. 1. 2011, 21:06:34 · Upravil/a: SkIpPeR
Vyřešeno, ale mám problém,
SQL: $result = mysql_query(" (SELECT 'T' as puvod, `id` as id, `nazev` as nazev, `forum` as forum, `user` as user, `text` as text, `datum` as datum, `cas` as cas, extract(hour from `cas`) as 'hodina', extract(minute from `cas`) as 'minuty', extract(day from `datum`) as 'den', extract(month from `datum`) as 'mesic', extract(year from `datum`) as 'rok' FROM f_topics WHERE `datum`>='".$f_profile_write['last']."') UNION (SELECT 'P' as puvod, `id` as id, `nazev` as nazev, `topic` as topic, `user` as user, `text` as text, `datum` as datum, `cas` as cas, extract(hour from `cas`) as 'hodina', extract(minute from `cas`) as 'minuty', extract(day from `datum`) as 'den', extract(month from `datum`) as 'mesic', extract(year from `datum`) as 'rok' FROM f_posts WHERE `datum`>='".$f_profile_write['last']."') ORDER BY `datum` DESC, `cas` DESC ") or die ("Hledaný výraz nenalezen!<br>".mysql_error()); Ale po tom při výpisu, mi muj kod nějak moc přehlíží podmínku, pokud potom mám: <?php while($result2=mysql_fetch_array($result)){ $puvod=$result2['puvod']; if ($puvod=='P'){ $f_topic = $result2['topic']; $f_topic_db = mysql_query("select * from `f_topics` where `id`='".$f_topic."' LIMIT 1"); $f_topic_write = mysql_fetch_array($f_topic_db); $f_forum = $f_topic_write['forum']; } else {$f_forum=$result2['forum']; $f_topic=$result2['id'];} Pokud potom vypíšu puvod, tak mi vrátí správně T nebo P, pokud vypíšu proměné f_topic nebo f_forum tak jsou u T správně ale u P jsou prázdné. |
||
Kajman_ Profil * |
#17 · Zasláno: 2. 1. 2011, 10:32:55
Názvy sloupců při union definuje první dotaz, názvy v dalších selectech se neberou v úvahu.
$f_topic = $result2['forum']; |
||
SkIpPeR Profil |
#18 · Zasláno: 2. 1. 2011, 11:19:55
Kajman:
Takže vlastně při P je sloupec topic pod nazvem forum? |
||
Časová prodleva: 14 let
|
0