Eu tenho a seguinte consulta:
$query_q_pass = sprintf("SELECT * FROM answers INNER JOIN users WHERE a_id = %s and answers.user_id = users.user_id");
$q_pass = mysql_query($query_q_pass, $cd) or die(mysql_error());
$row_q_pass = mysql_fetch_assoc($q_pass);
Agora o respostas tabela da consulta acima tem uma linha brand_url que tem muitos valores diferentes separados por vírgulas, e. dell, microsoft, hp, ...
O que eu quero fazer é selecionar todos esses valores do brand_url linha e adicioná-los em outra consulta onde vou extrair todas as marcas que existem dentro brand_url. Esta é a outra consulta:
$query_conn_brands = "SELECT * FROM brands WHERE brand_url = "VALUE FROM ABOVE QUERY"";
$conn_brands = mysql_query($query_conn_brands, $cd) or die(mysql_error());
$row_conn_brands = mysql_fetch_assoc($conn_brands);
$totalRows_conn_brands = mysql_num_rows($conn_brands);
Eu tentei muitas maneiras diferentes usando matrizes, mas tudo que eu obtenho são todos os resultados do marcas mesa. Esta é a minha última tentativa malsucedida:
$brand_pass_ids = $row_q_pass["brand_id"];
$array = array($brand_pass_ids,);
$query_conn_brands = "SELECT * FROM brands WHERE brand_url IN (" . implode(",", array_map("intval", $array)) . ")";
$conn_brands = mysql_query($query_conn_brands, $cd) or die(mysql_error());
$row_conn_brands = mysql_fetch_assoc($conn_brands);
$totalRows_conn_brands = mysql_num_rows($conn_brands);
Do exemplo acima tudo o que eu recebo é todos os resultados de marcas mesa e não apenas aqueles que existem dentro respostas mesa. Eu realmente espero que alguém me ajude com isso.
Muito obrigado!
Respostas:
1 para resposta № 1Use o MySQL "s FIND_IN_SET()
função:
Retorna um valor no intervalo de 1 a
N
se a stringstr
está na lista de stringsstrlist
consistindo de N substrings. Uma lista de strings é uma string composta de substrings separadas por “,
" personagens. Se o primeiro argumento for uma string constante e o segundo for uma coluna do tipoSET
, aFIND_IN_SET()
função é otimizada para usar bit aritmética. Retorna0
E sestr
não está emstrlist
ou sestrlist
é a string vazia. RetornaNULL
se um dos argumentos forNULL
. Esta função não funciona corretamente se o primeiro argumento contiver uma vírgula (“,
") personagem.mysql> SELECT FIND_IN_SET ("b", "a, b, c, d"); -> 2
No seu caso:
SELECT * FROM brands WHERE FIND_IN_SET(brand_url, ?)
Mas você pode juntar suas consultas se assim desejar:
SELECT *
FROM answers
JOIN users USING (user_id)
JOIN brands ON FIND_IN_SET(brands.brand_url, answers.brand_url)
WHERE a_id = %s
1 para resposta № 2
A razão pela qual está falhando é porque sua consulta será semelhante a:
SELECT * FROM brands WHERE brand_url IN (dell,microsoft,hp)
Existem valores de string e, portanto, devem ser manipulados como strings. Experimentar:
implode(",",array_map(function($a) {return json_encode($a);},$array))
Embora a codificação como JSON possa parecer louca, na verdade, é uma boa escolha aqui. As strings são agrupadas entre aspas e escapam conforme necessário, os números são deixados como estão e null
também é tratado corretamente.
EDITAR: Para versões mais antigas do PHP que não suportam funções anônimas:
implode(",",array_map(create_function("$a","return json_encode($a);"),$array));