【问题标题】:MySQLI, need to merge empty values with same ID into 1 row, and add to same row also if multiple inputsMySQLI,需要将具有相同ID的空值合并到1行,如果多个输入也需要添加到同一行
【发布时间】:2014-11-07 09:21:19
【问题描述】:

我很难弄清楚这一点。如果答案就在那里,我深表歉意,我已经搜索了所有的 stackoverflow。

我有一个订购系统,我通过 tableID 订购,如果有人订购东西,我会继续在我的数据库中创建行。我的问题是将我的数据放在 1 行上,在这个例子中是表 ID,所以所有订购的东西,只显示在 1 行上。

我有 3 张桌子,食物、饮料、甜点,在我的 OrderTable 中都有一个外键。

id fk_tableid fk_drinkId fk_foodId fk_dessId 数量 1 5 2 0 0 2 2 5 0 1 0 1 3 5 0 2 0 1 4 5 0 0 2 2 11 8 1 0 0 2 21 1 1 0 0 5 22 1 0 1 0 9 23 1 0 0 1 2

通过正常的选择,使用左连接,我可以在多行上获取数据,就像这样我得到那些 tableId 5 并显示订购消耗品的名称:

id fk_tableId fk_drinkId fk_foodId fk_dessId 数量 foodName 饮料名称 甜点名称 1 5 2 0 0 2 空 Sodavand 空 2 5 0 1 0 1 千层面 NULL NULL 3 5 0 2 0 1 比萨 NULL NULL 4 5 0 0 2 2 NULL NULL 软件

我也尝试使用 group_concat,它将数据放在 1 行,但它似乎将所有内容放在 1 行,而不仅仅是按 tableId 分组。

我希望它是这样的(例如 2x Lasagne,这正是我希望它在网站上的样子,但也许我需要使用 1xLasagne 两次。用 1x Beer 看起来会很乱10 次。):

fk_tableId fk_drinkId fk_foodId fk_dessId foodName drinkName甜点名称 fulllPrice 5 2,2 1,2 2,2 比萨、千层面 2xSodavand 2xSoftice 195

我知道我的问题格式可能有误,但我也很难 100% 知道在此处使用 Google 搜索和搜索什么。试了2天,还问我老师谁不行,他用CASES和sum()做了点什么,也没成功。

任何帮助将不胜感激!

更新:

添加 SQL 查询:

 SELECT 
        menukort_ordre.id,
       fk_tableId, 
       fk_drinkId,
       fk_foodId, 
       fk_dessId, 
       amount,
       menukort_food.name AS foodName,
       menukort_drink.name AS drinkName,
       menukort_dessert.name AS dessertName
       FROM menukort_ordre
       LEFT Join menukort_drink
       ON (menukort_ordre.fk_drinkId = menukort_drink.id)
       LEFT Join menukort_food
       ON (menukort_ordre.fk_foodId = menukort_food.id)
       LEFT Join menukort_dessert
       ON (menukort_ordre.fk_dessId = menukort_dessert.id)
       WHERE fk_tableid = fk_tableid

使用 GROUP_CONCAT 我尝试这样做,将其放在 1 行,但由于我的 WHERE,我将所有数据放在 1 行。

   GROUP_CONCAT(menukort_food.name ) AS foodName,
                         GROUP_CONCAT(menukort_drink.name) AS drinkName,
                         GROUP_CONCAT(menukort_dessert.name) AS dessertName

【问题讨论】:

    标签: select join mysqli group-by group-concat


    【解决方案1】:

    更新:

    首先,我更改了您的数据库设计,因为不需要 3 个这样的表,除非您真的希望将它们分开。我理解想要分离数据,但有时会这样做,有时不这样做。我明白,因为我的个人数据库项目让我打破了一切。所以下面的解决方案将基于我的设计,如下所示。

    类别

    代码或 ID (PK) 类别

    这个表将是一个查找表,只是为了确保饮料、食物和沙漠拼写正确。坦率地说,除非您需要特定的信息并希望它是正确的,否则您不需要它。

    接下来是存放饮料、甜点和食物的桌子

    项目

    ID 序列号 类别 姓名 价格

    最后是跟踪订单的订单表

    订单

    账单ID 表号 项目编号 (fk) 身份证(PK)

    通过这种方式,您可以跟踪食物送到哪张桌子以及每张支票或账单。如果您想知道每张桌子一天赚了多少,那么您的设计很好,但我假设您想知道每张账单的实际餐厅。有了这个,您可以在同一张账单上的同一张桌子上订购多个可乐或其他任何东西。

    现在开始解决问题。

    这没有计数,但如果你真的需要它可以处理它,但坦率地说,我认为计数是没有意义的,除非你要取消分组结果并有这样的东西:

    tableNum BillNum ItemNum ItemName 1 1 1 可乐 1 1 2 牛排 1 1 3 意大利面 1 1 1 可乐

    那么你可能会得到这样的结果

    tableNum BillNum ItemNum ItemName TimesBy 1 1 1 可乐 2 1 1 2 牛排 1 1 1 3 意大利面 1

    我相信下面的 SQL 代码会给你你需要的东西。我正在使用我的数据库版本,我认为您也应该这样做,因为它更容易,而且每件事都有 3 个表是没有意义的。

    CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (
    select BillID, tablenum,ItemNum,Items.name,Items.price
    from Orders, Items
    where Orders.ItemNum=Items.id
    );
    
    create TEMPORARY TABLE IF NOT EXISTS table3 AS (
    select SUM(price) as total, BillID
    from table2
    group by BillID
    );
    
    select table3.BillID, TableNum, GROUP_CONCAT(ItemNum order by ItemNum ASC) as ItemNum, GROUP_CONCAT(name order by name ASC) as Item, GROUP_CONCAT(price order by name asc) as   ItemPrice, total
    from table2, table3
    where table2.BillID=table3.BillID
    group by BillID;
    
    DROP TABLE IF EXISTS table2;
    DROP TABLE IF EXISTS table3;
    

    其他一些解决方案是考虑使用 php(编程)之类的东西来帮助解决这个问题或存储过程。

    如果您需要解释,请询问。我也很好奇这是作业还是项目?我只是想知道你为什么这样做?

    希望对你有帮助。

    【讨论】:

    • 您好!非常感谢您的帮助,这只是我自己的一些功课,因为我已经完成了我的项目。通常我会创建一个包含所有 3 种类型消耗品的表,然后在该表中按 TYPE 对它们进行排序,但我有点想尝试一种新方法,事实上我的老师无法弄清楚,嗯,它让我想弄清楚更多!虽然我失败了,并认为也许其他人可以解决这个问题,但我想修复它太糟糕了。非常感谢您的回复,马上开始工作,非常感谢!
    • 我认为您可以使用上面的 sql 代码并完成 3 个表,但可能需要更多的工作和微调。我相信这首先是不切实际的。很高兴它对你有用。
    猜你喜欢
    • 2014-01-10
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2016-09-16
    • 2023-01-22
    相关资源
    最近更新 更多