Autor Zpráva
SkIpPeR
Profil
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 *
Co vypíše mysql_error?
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=37836#chyba
SkIpPeR
Profil
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
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
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 *
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
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&amp;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&amp;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&amp;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&amp;t=".$f_topic_write['id']."'><span class='f_category_nadpis'>".$result2['post_nazev']."</span><br>".$result2['post_text']."</a></td></tr>";
}
}
}
Kajman_
Profil *
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
Kajman:
Opraveno, špatně opsáno.

Moc nechápu druhou větu.
Kajman_
Profil *
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
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 *
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
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?
SkIpPeR
Profil
Prosím, mužete mi někdo pomoci, mám šibeniční termín do pátku :(
SkIpPeR
Profil
Vypadá to, že je dotaz špatně, i když je hledaný výraz určitě v databázi, tak potom
$pocet=mysql_num_rows($result);
vrací vždy hodnotu 0
SkIpPeR
Profil
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 *
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
Kajman:
Takže vlastně při P je sloupec topic pod nazvem forum?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0