PHP MYSQL消除表中的逗号

时间:2012-08-17 01:30:41

标签: php mysql arrays explode implode

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匹配的方法。所以最后我可以得到成本。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

首先,答案不涉及更改架构:

MySQL的FIND_IN_SET功能:

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

然而,理想的解决方案是规范化架构(时间允许我将提交另一个答案以及更多细节)

答案 1 :(得分:1)

规范化架构

在我看来,这个问题的唯一“真实”答案是使用规范化架构对域进行建模。具体来说,我们永远不应该有一个列存储多于一个数据的列。我们用来描述你的域的术语是多对多关系,其中tb1中的一行与tb2中的许多行相关,而tb2中的一行可以与许多行相关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的拖曳。

答案 2 :(得分:0)

试试这个:

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

编辑:如果代码可以获得超过一位数的数字(如code10,code11),这会导致一些问题。你不应该删除最后一个逗号,并使用:

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

答案 3 :(得分: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      |
 ---------------

答案 4 :(得分:0)

您可以使用FIND_IN_SET()加入这两个表:

SELECT a.id, b.cost
FROM   tb1 a
JOIN   tb2 b ON FIND_IN_SET(b.code, a.codetb1) > 0