【问题标题】:PHP MYSQL Eliminate Comma from TablePHP MYSQL 消除表格中的逗号
【发布时间】:2012-08-17 01:30:41
【问题描述】:

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

【问题讨论】:

  • 请尝试重新表述您的问题,以便其他人不需要阅读这些不清楚的句子。尽力而为——从他人那里获得适当的帮助可能取决于它。

标签: php mysql arrays explode implode


【解决方案1】:

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

MySQL的FIND_IN_SET函数:

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

但是,理想的解决方案是规范化架构(时间允许我将提交另一个包含更多详细信息的答案)

【讨论】:

  • 不幸的是,它没有用。谢谢你的时间。实际上,我的数据库比我试图解释的要复杂。我所有的桌子都相互连接。这是最后一步,我正在尝试修复。乘以列表,我从数据库中获取。所有这些选定的列表项,我用 implode(逗号)插入,然后是这个应用程序的最后一步。这些项目。我正在尝试摆脱那些逗号,并根据每个项目获取价格列表,仅此而已。你有什么建议我可以找到解决方案。再次感谢。
  • 是的,我有一个建议;请参阅我的其他答案(规范化架构)。此外,您可能需要删除空格,因为它可能会破坏 find_in_set 处理字符串的能力。我知道标准化看起来很复杂,但我们这样做的原因有很多;你所拥有的是一个具体的例子。这真是草率的东西,从长远来看,维护起来会很讨厌。为您所构建的内容感到自豪,正确地构建它。
  • SELECT * FROM tb1, tb2 WHERE FIND_IN_SET(tb2.codetb2, tb1.codetb1);
  • 确实有效!谢谢,但是,我得到了第一个值的结果。如何获得逗号后下一个值的结果。
【解决方案2】:

规范化架构

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

【讨论】:

    【解决方案3】:

    试试这个:

    $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'";
    

    【讨论】:

    • 我试过了,但没用。也许我无法让它工作。谢谢你的时间。也许我不应该在数据库中插入任何带逗号的东西
    【解决方案4】:

    您可以使用FIND_IN_SET() 连接这两个表:

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

    【讨论】:

    • 我不太了解那个结构。甲和乙?我用我的理解试了一下,结果是空屏。
    【解决方案5】:

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

    【讨论】:

    • 感谢您的宝贵时间。但是对我来说改变整个数据库表结构并不容易。我有超过 6 张桌子。全部连接。
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多