1

序文:はい、これが悪い設計であることは認識していますが、これを変更することはできません。

質問

顧客テーブルがあり、その中に「製品」フィールドがあります。サンプルの顧客製品フィールドの内容の例を次に示します。

36;40;362

これらの各番号は、products テーブルのレコードを参照します。私はやろうとしています

(SELECT group_concat(productName) from products where productID=???)

しかし、区切り文字に問題があります。セミコロンを削除する方法を知っていて、'where INSTR' または IN を試しましたが、うまくいきません。

フィールド全体をPHPに返し、そこで分解/解析するのが最善の方法ですか?

4

2 に答える 2

4

FIND_IN_SETMySQLで関数を使用できます。

セミコロンをコンマに置き換えて、クエリで使用する必要があります。

SELECT group_concat(productName)
FROM products
WHERE FIND_IN_SET(productID, ???) > 0

???カンマで区切る必要があることを覚えておいてください。

于 2012-10-09T15:22:26.000 に答える
2

おっしゃる通り、この方法はいけません。しかし、それは不完全な世界なので:

次のようなデータベース構造を想定します。

+-PRODUCTS---------+    +-CUSTOMERS---------+------------+
| ID | productName |    | ID | customerName | productIDs |
+----+-------------+    +----+--------------+------------+
|  1 | Foo         |    |  1 | Alice        | 1;2        |
+----+-------------+    +----+--------------+------------+
|  2 | Bar         |    |  2 | Bob          | 2;3        |
+----+-------------+    +----+--------------+------------+
|  3 | Baz         |    |  3 | Charlie      |            |
+----+-------------+    +----+--------------+------------+

次に、次のようなクエリです。

   SELECT customers.*, 
          GROUP_CONCAT(products.id) AS ids, 
          GROUP_CONCAT(productName) AS names
     FROM customers
LEFT JOIN products
       ON FIND_IN_SET(products.id, REPLACE(productIDs, ";", ","))
 GROUP BY customers.id

戻ります:

+-RESULT------------+------------+-----+---------+
| ID | customerName | productIDs | ids | names   |
+----+--------------+------------+-----+---------+
|  1 | Alice        | 1;2        | 1,2 | Foo,Bar |
+----+--------------+------------+-----+---------+
|  2 | Bob          | 2;3        | 1,2 | Bar,Baz |
+----+--------------+------------+-----+---------+
|  3 | Charlie      |            | 1,2 | NULL    |
+----+--------------+------------+-----+---------+

FIND_IN_SET( search_value, comma_separated_list )指定されたカンマ区切りの文字列で値を検索します。したがって、セミコロンをコンマに置き換える必要があります。これは明らかにREPLACE()そうです。この関数の戻り値は、最初に一致した位置です。たとえば、次のようになります。

SELECT FIND_IN_SET(3, '1,3,5')   = 2
SELECT FIND_IN_SET(5, '1,3,5')   = 3
SELECT FIND_IN_SET(7, '1,3,5')   = NULL
于 2012-10-09T15:27:29.723 に答える