我有以下查询:
$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);
现在,上面查询中的答案表格中有一行 brand_url ,其中有许多不同的值,用逗号分隔,例如: dell,microsoft,hp, ......
我想要做的是从 brand_url 行中选择所有这些值,然后将其添加到另一个查询中,我将提取 brand_url 中存在的所有品牌。这是另一个查询:
$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);
我尝试了许多使用数组的不同方法,但我得到的只是来自品牌表的所有结果。这是我最后一次尝试不成功的尝试:
$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);
从上面的示例中我得到的是品牌表的所有结果,而不仅仅是答案表中存在的结果。我真的希望有人能帮助我。
非常感谢!
答案 0 :(得分:1)
它失败的原因是因为您的查询将如下所示:
SELECT * FROM brands WHERE brand_url IN (dell,microsoft,hp)
有字符串值,因此必须将它们作为字符串处理。尝试:
implode(",",array_map(function($a) {return json_encode($a);},$array))
虽然编码为JSON可能看起来很疯狂,但它实际上是一个不错的选择。字符串用引号括起来并根据需要进行转义,数字保持原样,null
也可以正确处理。
编辑:对于不支持匿名函数的旧版PHP:
implode(",",array_map(create_function('$a','return json_encode($a);'),$array));
答案 1 :(得分:1)
使用MySQL的FIND_IN_SET()
功能:
如果字符串
N
<,则返回1到str
范围内的值/ strong>位于字符串列表strlist
中,包含N个子字符串。字符串列表是由以“,
”字符分隔的子字符串组成的字符串。如果第一个参数是常量字符串而第二个参数是SET
类型的列,则FIND_IN_SET()
函数被优化为使用位算术。如果0
不在str
中,或者如果strlist
,则返回strlist
NULL
是空字符串。如果任一参数为NULL
,则返回,
。如果第一个参数包含逗号(“SELECT * FROM brands WHERE FIND_IN_SET(brand_url, ?)
”)字符,则此函数无法正常工作。mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
在你的情况下:
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}}