0

我有以下查询:

$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);

从上面的示例中,我得到的只是品牌表中的所有结果,而不仅仅是答案表中存在的结果。我真的希望有人能帮助我解决这个问题。

非常感谢!

4

2 回答 2

1

使用 MySQL 的FIND_IN_SET()功能:

N如果字符串在由 N 个子字符串组成str的字符串列表中,则返回 1 到范围内的值。strlist字符串列表是由“<code>”字符分隔的子字符串组成的字符串。如果第一个参数是常量字符串,第二个参数是 type 的列SET,则FIND_IN_SET()函数被优化为使用位算术。0如果str不在strlist或是否strlist为空字符串,则返回。NULL如果任一参数为 则返回NULL。如果第一个参数包含逗号 (“<code>,”) 字符,则此函数无法正常工作。

mysql> SELECT FIND_IN_SET('b','a,b,c,d'); 
        -> 2

在你的情况下:

SELECT * FROM brands WHERE FIND_IN_SET(brand_url, ?)

但是,如果需要,您可以将您的查询连接在一起:

SELECT *
FROM   answers
  JOIN users  USING (user_id)
  JOIN brands ON FIND_IN_SET(brands.brand_url, answers.brand_url)
WHERE a_id = %s
于 2012-05-28T19:33:17.400 回答
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));
于 2012-05-28T19:22:17.633 回答