/ / Usando Array resulta em consulta MySQL - php, mysql, arrays, implode

Usando Array resulta na consulta MySQL - php, mysql, arrays, implodir

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 № 1

Use o MySQL "s FIND_IN_SET() função:

Retorna um valor no intervalo de 1 a N se a string str está na lista de strings strlist 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 tipo SET, a FIND_IN_SET() função é otimizada para usar bit aritmética. Retorna 0 E se str não está em strlist ou se strlist é a string vazia. Retorna NULL se um dos argumentos for NULL. 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));