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

规范化模式

在我看来,这个问题的唯一“真正”答案是使用规范化模式对域进行建模。具体来说,我们永远不应该让一列存储超过一条数据。我们用来描述您的域的术语是存在多对多关系,其中 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 即可。

于 2012-08-17T02:03:08.093 回答
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'";
于 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

您可以使用以下方法连接两个表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 回答