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

上記のクエリの回答テーブルには、 dell、microsoft、hp など、コンマで区切られた多くの異なる値を持つ行brand_urlがあります。

私がやりたいことは、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

失敗する理由は、クエリが次のようになるためです。

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 に答える
1

MySQL のFIND_IN_SET()関数を使用します。

文字列が N 個の部分文字列で構成される文字列リストにあるN場合は、1 ~ の範囲の値を返します。文字列リストは、「<code>,」文字で区切られた部分文字列で構成される文字列です。最初の引数が定数文字列で、2 番目の引数が type の列である場合、関数はビット演算を使用するように最適化されます。が空文字列でない場合、またはが空の文字列である場合に返します。いずれかの引数が である場合に返します。最初の引数にコンマ ("<code>,") 文字が含まれている場合、この関数は正しく動作しません。strstrlistSETFIND_IN_SET()0strstrliststrlistNULLNULL

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 に答える