【问题标题】:GROUP by inside INNER join with displaying in html drop down list using phpGROUP by inside INNER join 使用 php 在 html 下拉列表中显示
【发布时间】:2015-11-27 07:25:02
【问题描述】:

我有以下表格:

Workers (id, total_pay, date_of_pay, projects_id)
Payments (id, payment, date, projects_id)
building_materials(id, pay_of_materials, date, projects_id)
additional(id, add_pay, date, projects_id)

其中 projects_id 是所有项目的外键。 我尝试进行查询以从 projects_id = projects_id 的所有表中选择所有日期,我现在有这个语句:

SELECT workers.date_of_pay, payments.date, building_materials.date, additional.date FROM
workers 
INNER JOIN 
payments ON workers.projects_id = payments.projects_id
INNER JOIN 
building_materials ON payments.projects_id = building_materials.projects_id
INNER JOIN 
additional ON building_materials.projects_id = additional.projects_id;

我到底想要什么,但无法弄清楚,是如何使用 GROUP BY 对每个字段进行分组,以及如何在一个下拉列表框中将所有列显示为一个? 我有这个列表框代码:

<select name="Date" required class="form-control" id="Date">
                    <option value="">اختر التاريخ</option>
                    <?php $sql="    SELECT workers.date_of_pay, payments.date, building_materials.date, additional.date FROM
    workers 
    INNER JOIN 
    payments ON workers.projects_id = payments.projects_id
    INNER JOIN 
    building_materials ON payments.projects_id = building_materials.projects_id
    INNER JOIN 
    additional 

ON 
building_materials.projects_id = additional.projects_id AND additional.projects_id = ".$id;
                $result = mysqli_query($con, $sql) or die($sql."<br/><br/>".mysql_error());

                    while($rows=mysqli_fetch_array($result)){?>
                        <option value="<?php echo $rows['date'] ?>"><?php echo $rows['date'] ?></option>
                    <?php } ?>
                    </select>

所以,稍后,我可以从下拉列表中选择一个日期并获取信息。 那么我如何分组,并将结果回显到下拉列表中。

编辑 使用 concat() 后:

SELECT concat(workers.date_of_pay, payments.date, building_materials.date, additional.date) AS date FROM
    workers 
    INNER JOIN 
    payments ON workers.projects_id = payments.projects_id
    INNER JOIN 
    building_materials ON payments.projects_id = building_materials.projects_id
    INNER JOIN 
    additional ON building_materials.projects_id = additional.projects_id

我有这个:

但我希望每一行只有一个日期。

【问题讨论】:

  • 您必须将不同的列合并为一列才能显示在一个下拉列表中。
  • 怎么做,如何分组?
  • 您可以使用 CONCAT() 函数将所有列连接为一个。由于您不使用任何聚合函数,因此您可以使用 ORDER BY 来按特定顺序对结果进行排序,而不是 GROUP BY。
  • 先生,看看我的编辑,concat 将行的结果放在一起,我想要的是每个日期形成一行。查看已编辑的问题

标签: php html mysql


【解决方案1】:

使用 UNION ALLGROUP BY,如下所示。使用可用的代码,我可以编写这样的解决方案。您可以减少连接取决于表架构。并尝试使用 mysqli 而不是 mysql

$sql = "SELECT * FROM (
       (SELECT workers.date_of_pay AS real_date FROM
            workers 
            INNER JOIN 
            payments ON workers.projects_id = payments.projects_id
            INNER JOIN 
            building_materials ON payments.projects_id = building_materials.projects_id
            INNER JOIN 
            additional 
            ON building_materials.projects_id = additional.projects_id AND additional.projects_id = $id)"
        . " UNION ALL"
        ."(SELECT payments.date AS real_date FROM
            workers 
            INNER JOIN 
            payments ON workers.projects_id = payments.projects_id
            INNER JOIN 
            building_materials ON payments.projects_id = building_materials.projects_id
            INNER JOIN 
            additional 
            ON building_materials.projects_id = additional.projects_id AND additional.projects_id = $id)"
        . " UNION ALL"
        . "(SELECT building_materials.date AS real_date FROM
            workers 
            INNER JOIN 
            payments ON workers.projects_id = payments.projects_id
            INNER JOIN 
            building_materials ON payments.projects_id = building_materials.projects_id
            INNER JOIN 
            additional 
            ON building_materials.projects_id = additional.projects_id AND additional.projects_id = $id)"
        . " UNION ALL"
        . "(SELECT additional.date AS real_date FROM
            workers 
            INNER JOIN 
            payments ON workers.projects_id = payments.projects_id
            INNER JOIN 
            building_materials ON payments.projects_id = building_materials.projects_id
            INNER JOIN 
            additional 
            ON building_materials.projects_id = additional.projects_id AND additional.projects_id = $id)"
        . ") AS tab GROUP BY real_date";

【讨论】:

  • 哦,谢谢,它有效,但是先生,如何在 mysqli 中使用它?你能帮忙添加mysqli代码吗?
  • OR pdo,因为用于插入。删除和更新我使用的是 PDO 代码,但是当在 html 表中显示一些数据时,我使用的是 mysql 或 mysqli
  • 你可以看看从mysql迁移到mysqli :stackoverflow.com/questions/1390607/…
  • 先生,我的代码有问题,当项目有一个空的日期字段时,它不会在下拉列表中显示任何内容???!!!!
  • 由于您使用了INNER JOIN,因此如果任何表没有条目,则不会占用。对此类表使用 LEFT JOIN
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多