Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gui Siani

Caso curioso com INNER JOIN

Recommended Posts

A seguinte query retorna TODOS os match_id da tabela match que forem do dia 2014-11-14, mas o que eu preciso é que retorna todos os match_id em que o profile_id da tabela score estiver contido em profile_ids da tabela match e, que o score_id da tabela score fosse igual score_id da tabela score_player e o profile_id da tabela score_player fosse igual ao especificado na query (80675309).

 

Não consigo identificar o erro. A lógica parece estar perfeita. Segue query:

SELECT DISTINCT m.match_id 
FROM `match` AS m 
INNER JOIN `score` AS s ON m.profile_ids LIKE CONCAT('%',s.profile_id,'%') 
INNER JOIN score_player AS sp ON s.score_id = sp.score_id
WHERE sp.profile_id = 8067530 AND m.match_date = '2014-11-14'

Na tabela match, a coluna profile_ids possui dois profile_id "1234;4321" separado por ponto e virgula

 

Desde já, obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
... estiver contido em ...

 

 

Não seria o caso de um subslect do tipo In ?

m.profile_ids in (select s.profile_id from socre s where ...)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa, Motta.. Eu não sabia do subselect !

 

Eu estou executando a query abaixo, mas ele retorna TODOS os match_id da data especificada em match_date ... Não filtra só os dados coletados no IN. Se eu executar só a subquery, ele retorna todos os profile_id certinho

SELECT match_id FROM `match` WHERE profile_ids IN (
SELECT s.profile_id 
FROM `score` AS s 
INNER JOIN score_player AS sp ON s.score_id = sp.score_id
WHERE sp.profile_id = 806753099388913 AND s.score_date = '2014-11-14') AND match_date = '2014-11-14'

Estou achando que a cláusula IN está errada ai. Embora para encontrar a partir de um Array, tem que ser IN, né? por exemplo: (123,432,534,765) LIKE m.profile_ids. Pegar todos os match_id de onde encontrar esses IDs de m.profile_ids.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei o problema! Embora eu ainda não sei como resolver...

A query que postei acima está correta, porém, como os profile_id estão separados por virgula na tabela match, coluna profile_ids, ele só encontra o match_id desde que o profile_id esteja antes do ponto e vírgula ";", se estiver depois, ele não acha!

Compartilhar este post


Link para o post
Compartilhar em outros sites

match.profile_ids liga com score.profile_id ?!

SELECT match_id , profile_ids
FROM `match` 
WHERE profile_ids IN (SELECT s.profile_id
                      FROM `score` AS s
                      INNER JOIN score_player AS sp ON s.score_id = sp.score_id
                      WHERE sp.profile_id = 806753099388913 
                      AND s.score_date = '2014-11-14') 
AND match_date = '2014-11-14'

seria isto mesmo (mas não conheço o modelo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

RESOLVIDO!

 

Encontrei uma solução com esta dica aqui:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';

Primeiro eu seleciono todos os profile_id de score ligado com score_player:

SELECT s.profile_id 
FROM `score` AS s 
INNER JOIN score_player AS sp ON s.score_id = sp.score_id
WHERE sp.profile_id = 806753099388913 AND s.score_date = '2014-11-14'

A partir destes profile_id, eu gero um array e mesclo os dados com barra "|" (implode('|', array)). Feito isso, eu pesquiso na tabela match, os profile_id que se assemelham aos da coluna profile_ids com esta query aqui:

SELECT m.match_id 
FROM `match` AS m
WHERE m.profile_ids REGEXP 'profile_ids_mesclados' AND match_date = '2014-11-14'

Obrigado ae, pessoal!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.