Jump to content
cdaniel

[Resolvido] Procurar em várias tabelas (Mysql/PHP)

Recommended Posts

cdaniel

Boas.

Estou com um problema.. Tenho um script de procura, só que só procura em uma tabela e eu queria que procurasse em várias mas que apresenta-se os resultados encontrados nas várias tabelas, conforme o critério.

Tenho as seguintes tabelas:

noticias|topicos|posts|users

já tentei de tudo, union, join e nada me solucionou  :dontgetit:

algo como:

SELECT * FROM noticias,topicos,posts,users WHERE noticias.titulo LIKE '%".$criterio."%' AND topicos.topico LIKE '%".$criterio."%'

obrigado desde já

Share this post


Link to post
Share on other sites
fantasma

usaste uma cena do genero

$query=mysql_query($sql) 

certo?

se sim faz

 

if(!$query)
{
    echo "Erro ao executar a query".mysql_error();
}

e posta o codigo de erro.

Share this post


Link to post
Share on other sites
cdaniel

SELECT * FROM noticias WHERE titulo LIKE '%admin%' UNION ALL SELECT * FROM users WHERE username LIKE '%admin%'

Erro ao executar a query - The used SELECT statements have a different number of columns

solved, troquei o * pelas rows pretendidas e já está a funcionar. obrigado fantasma, vou começar a por sempre o mysql_error nas querys  :cheesygrin:

Share this post


Link to post
Share on other sites
fantasma

Devias faze-lo sempre! Essa "pequena" grande funçãozinha é uma problem-solver...

Assim como devias evitar o SELECT * por causa dos ataques mySQL Injection

Marca o tópico como resolvido...

Um abraço,

Share this post


Link to post
Share on other sites
cdaniel

agora estou com um problema, se procurar uma noticia o titulo aparece no lugar correcto, mas se procurar um user o username aparece na row do titulo e não na sua  :wallbash:

isto é o que aparece na pagina se procurar por "admin" que é um user

ali:admin
aqui:

e isto é o que acontece se procurar por "michael" que é uma noticia

ali:Michael Jackson morreu
aqui:

o que tenho no código é isto:

ali:".$row['titulo']."</a></b><br> aqui:".$row['username']."<br>";

cheira-me a erro por parte do sql..

Share this post


Link to post
Share on other sites
fantasma

outra funçãozinha jeitosa

coloca depois do mysql_fetch_assoc (ou array)

print_r($row)

e mostra pf o resultado

Share this post


Link to post
Share on other sites
cdaniel

Array ( [0] => Testezito [titulo] => Testezito )  ali:Testezito (é um tópico)
aqui:


Array ( [0] => test1 [titulo] => test1 )  ali:test1 (um user)
aqui:


Array ( [0] => teste [titulo] => teste )  ali:teste (outro user)
aqui:

isto aqui é que já não estou a perceber  ;)

Share this post


Link to post
Share on other sites
fantasma

Basicamente o que a tua query está a mandar para o array é um titulo. Não te aparece um erro do tipo "Notice undefined index 'username' at blablabla..."?

Posta o código completo sff

Share this post


Link to post
Share on other sites
cdaniel

não me aparece nada, os resultados estão bem mas estão definidos de forma errada, não devia ser tudo titulo

if($_GET['type']){
$ssql = "SELECT ".$row." from ".$table." ".$criterio ." LIMIT ".$inicio . ",".$TAMANHO_PAGINA;
} else {
$ssql = "SELECT ".$row." FROM ".$table." ".$criterio." UNION SELECT ".$row2." FROM ".$table2." ".$criterio2." UNION SELECT ".$row3." FROM ".$table3." ".$criterio3." UNION SELECT ".$row4." FROM ".$table4." ".$criterio4." LIMIT " . $inicio . "," . $TAMANHO_PAGINA;
}
$rs = mysql_query($ssql) or die("MySQL error: ".mysql_error());
//echo "resultados: ".$num_total_registos."";
while($row = mysql_fetch_array($rs)){
print_r($row);
    echo "<a href=\"index.php?pag=noticias&noticia=".$row['id']."\"><img src=\"".$sgetpath."".$row['foto']."\" width=\"50\" height=\"50\" border=\"0\" align=\"left\" alt=\"\"></a> <b><a href=\"index.php?pag=noticias&noticia=".$row['id']."\">ali:".$row['titulo']."</a></b><br> aqui:".$row['username']."<br/><br/><br/>";
}
if($num_total_registos == 0){
echo "Não foi encontrado qualquer resultado.";
}

não vejo nada de mal no php, eu acho que deve faltar qualquer coisa na query agora o quê não sei  :wallbash:

Share this post


Link to post
Share on other sites
brunoais

não percebi qual é o problema.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
cdaniel

o problema é que estou a buscar resultados de várias tabelas, ou seja as rows são diferentes. o que está a acontecer aqui é que a row username está a aparecer como se fosse a row titulo 🤔

Share this post


Link to post
Share on other sites
brunoais

Executa isto antes do

$rs = mysql_query($ssql) or die("MySQL error: ".mysql_error());

isto:

echo $ssql;

Para eu saber o q é que estás para aí a escrever na query.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
cdaniel

Se seleccionar a opção de procurar em tudo dá isto:

SELECT titulo FROM noticias WHERE titulo LIKE '%as%' UNION SELECT nometopico FROM topicos WHERE nometopico LIKE '%as%' UNION SELECT post FROM posts WHERE post LIKE '%as%' UNION SELECT username FROM users WHERE username LIKE '%as%' LIMIT 0,10

E se seleccionar a opção de procurar só, por exemplo nas noticias

SELECT titulo from noticias WHERE titulo LIKE '%asd%' LIMIT 0,10

Não sei o que poderá estar a causar isto.  :wallbash:

Share this post


Link to post
Share on other sites
cdaniel

pessoal dêem-me lá uma ajudinha, estive estas horas todas a pesquisar e a tentar que aquilo funcionasse mas sem sucesso. Essas 4 tabelas são todas diferentes umas das outras, eu quero que o script procure diferentes rows em diferentes tabelas baseado num critério.. ou seja, vai procurar noticias, utilizadores, tópicos, tudo em simultâneo. portanto no while vai ter que ter várias rows para diferentes resultados ($row['titulo'] se encontrar uma noticia, $row['username'] se encontrar um user), mas o problema aqui é que está a ir tudo para a $row['titulo'], pois é o primeiro select que faço na query mas não entendo é porquê.

Não sei se me fiz entender bem, mas já estou a perder cabelo com isto  :wallbash:

Share this post


Link to post
Share on other sites
brunoais

Precisas mesmo de executar esses unions todos?

Isso demora imenso tempo.

Porque não executar vários queries?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
cdaniel

é possível? mas isso não vai fazer com que tenha que ter mais whiles, ou seja os resultados vão aparecer de forma "organizada"?

(ex) resultado:

noticias - while 1

---------

tópicos - while 2 etc

---------

posts

---------

users

Share this post


Link to post
Share on other sites
brunoais

E se usasses INNER JOIN ou LEFT OUTER JOIN ou RIGHT OUTER JOIN?

Isso parece tudo juntável usando um INNER JOIN.

INNER JOIN É bem mais rápido que o UNION (nos testes no meu computador usando MySQL)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
cdaniel

mas pelo que li sobre o join tenho que ter pelo menos uma row igual em duas tabelas, coisa que eu não tenho e não faz sentido ter só para pesquisar 🤔

Share this post


Link to post
Share on other sites
brunoais

A mensagem q tinha escrito:

Andei a fazer testes... O UNION não é solução. Ele junta tudo , neste caso, numa coluna sem sequer diferenciar aonde é que uma query acaba e outra começa. O INNER JOIN mostra duplicados, triplicados, quadriplicados... (depende do nº de tabelas q queres juntar). O FULL OUTER JOIN mete NULL até mais não. Para este número de tabelas e o nº possível de registos o impacto de performance tanto no php como no DBMS é demasiado grande. FULL OUTER JOIN de subqueries é horrivelmente lento.

Mais vale executares várias queries, uma para cada tabela. Acaba por ser mais rápido e prático do que tentar obter vários dados de várias tabelas numa única query.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.