0

tb1

-----------------
id | codetb1
-----------------
1  | code1,code2
2  | code2,code3

tb2

-----------------
codetb2 | cost
-----------------
code1   | $20
code2   | $40
code3   | $60

save.php -> これは、チェックボックスの値をデータベースに挿入する方法です。

$codetb1 = $_POST['codetb1'];
var_dump($codetb1);

// Setting up a blank variable to be used in the coming loop.
$allStyles = "";
// For every checkbox value sent to the form.
foreach ($typeocodetb1fvisit as $style) {
    // Append the string with the current array element,
    // and then add a comma and a space at the end.
    $allStyles .= $style . ", ";
}
// Delete the last two characters from the string.
$allStyles = subs

tr($allStyles, 0, -2);

Result.php -> これは私の接続であり、結果を取得する方法です

$query="SELECT * FROM tb1, tb2 WHERE
  tb1.codetbl1 = tb2.codetbl2 AND
  tb1.id='$id'";

こんにちは -- ご協力いただきありがとうございます。2 つのデータベース (テーブル 1 とテーブル 2) があります。2 つのデータベースを相互にリンクしたいと考えています。これを達成するのに苦労しています。たとえば、私は爆発しようとしましたが、それを機能させることができませんでした.

では、codetb1 からコンマを取り除き、codetb2 と一致させる方法を見つけるにはどうすればよいでしょうか。それで、ようやくコストを取得できます。何か案は?

4

5 に答える 5

2

まず、スキーマの変更を伴わない答え:

MySQL のFIND_IN_SET関数:

SELECT * 
FROM tb1, tb2 
WHERE FIND_IN_SET(tb2.codetb2, tb1.codetb1);

ただし、理想的な解決策は、スキーマを正規化することです(時間が許せば、詳細を記載した別の回答を提出します)

于 2012-08-17T01:45:44.920 に答える
1

正規化されたスキーマ

私の意見では、この質問に対する唯一の「本当の」答えは、正規化されたスキーマでドメインをモデル化することです。具体的には、1 つの列に複数のデータを格納することはできません。ドメインを説明するために使用する用語は、tb1 の 1 つの行が tb2 の多くの行に関連付けられ、tb2 の 1 つの行が tb1 の多くの行に関連付けられる多対多の関係があることです宛先スキーマは次のようになります。

tb1

---------
id | ...
---------
1  | ...
2  | ...

tb2

----------
id | cost
----------
 1 | $20
 2 | $40
 3 | $60

tb1_tb2

-----------------
 tb1_id | tb2_id 
-----------------
    1   |    1
    1   |    2
    2   |    2
    2   |    3

次に、それらを選択する方法は、必要なものによって異なります。ここではいくつかの例を示します。

tbl1 の各行の最高および最低の「コスト」:

SELECT tb1.name, MIN(tb2.cost) as low, MAX(tb2.cost) as high
FROM tb1 
  JOIN tb1_tb2 ON tb1.id = tb2.tb1_id
  JOIN tb2_ON tb1_tb2.tb2_id = tb21.id
GROUP BY tb1.name

tb1 の行のコストの合計:

SELECT tb1.name, SUM(tb2.cost) as total
FROM tb1 
  JOIN tb1_tb2 ON tb1.id = tb2.tb1_id
  JOIN tb2_ON tb1_tb2.tb2_id = tb21.id
GROUP BY tb1.name

アイデアは、それぞれの「もの」を完全かつ明確にモデル化することです。秘訣は、tb1 と tb2 の間の各関係を別個の「もの」と考えることです (つまり、それぞれが tb1_tb2 に単一の行を持ちます。関係は、正規化されたスキーマのフルクラス市民です)。

リレーションシップを別個のエンティティとして考えれば、挿入は非常に簡単です。関連付けたい tb1 と tb2 がある場合は、tb1_tb2 にトウを ID とともに追加するだけです。

于 2012-08-17T02:03:08.093 に答える
0

これを試して:

$query="SELECT * FROM tb1, tb2 WHERE
`tb1.codetbl1` LIKE concat('%', concat(`tb2.codetbl2`, '%')) AND
tb1.id='$id'";

編集:コードが1桁以上の数字(code10、code11など)を取得できる場合、これは少し問題を引き起こします。最後のカンマを削除せず、次を使用してください。

$query="SELECT * FROM tb1, tb2 WHERE
`tb1.codetbl1` LIKE concat('%', concat(`tb2.codetbl2`, ',%')) AND
tb1.id='$id'";
于 2012-08-17T01:40:47.790 に答える
0

table2 列 table_id を持つことができ、クエリは次のようになります

$query="SELECT * FROM tb1, tb2 WHERE
tb1.codetbl1 = tb2.tb1_id AND
tb1.id='$id'";

あなたの質問から、あなたが構築しようとしているカートのようなものだと思うので、これらのようなテーブルが必要です。

//table customer_cart
 -------------------------
 | id|item_code|customerid|
 -------------------------
 |1  |itemcode1|1         |
 --------------------------
 |2  |itemcode2|1         |
 --------------------------

そしてアイテムテーブル

 ---------------
 | id|price    |
 ---------------
 |1  |$30      |
 ---------------
 |2  |$60      |
 ---------------
于 2012-08-17T01:43:42.847 に答える
0

次を使用して、2 つのテーブルを結合できますFIND_IN_SET()

SELECT a.id, b.cost
FROM   tb1 a
JOIN   tb2 b ON FIND_IN_SET(b.code, a.codetb1) > 0
于 2012-08-17T01:45:58.547 に答える