【问题标题】:How to compare two DB tables of different number of rows based on one attribute in MySql?如何根据MySql中的一个属性比较两个不同行数的DB表?
【发布时间】:2015-12-26 12:27:48
【问题描述】:

我有什么:

1.我有两个数据库表displaybid,如下所示:

mysql> select * from display where gp_no = 1;

+-------+--------------+-----------+--------------------+---------------+-----------+----------------+
| gp_no | no_of_member | amount    | current_instalment | starting_date | member_no | member_name    |
+-------+--------------+-----------+--------------------+---------------+-----------+----------------+
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         1 | Akansha Gupta  |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         2 | Akash Bansal   |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         3 | Ashish Gupta   |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         4 | Chavi Jain     |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         5 | Dhruv Goel     |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         6 | Mukul Gupta    |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         7 | Nancy Aggarwal |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |         9 | Prateek Jain   |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        11 | Rajender Gupta |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        12 | S K Goel       |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        13 | Sadhna Goel    |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        15 | Sandeep Jain   |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        16 | Sunil Jain     |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        17 | Sunil Sharma   |
|     1 |           15 | 375000.00 |                  2 | 2015-05-01    |        19 | Sunita Gupta   |
+-------+--------------+-----------+--------------------+---------------+-----------+----------------+
15 rows in set (0.00 sec)

mysql> select date , member_no from bid where gp_no = 1 order by member_no asc;
+------------+-----------+
| date       | member_no |
+------------+-----------+
| 2015-06-01 |         7 |
| 2015-05-01 |        16 |
+------------+-----------+
2 rows in set (0.00 sec)

我想要什么:

  1. 我想比较两个表中的member_no 以及我得到匹配的位置 它应该显示来自表bid 的日期,否则它应该显示Not Withdraw。使用我正在使用的代码,我只能显示第一个日期,即只有第一个匹配。我可能知道这是因为号码不匹配。两个表的行数。

但它也应该在member_no = 16 前面显示日期。

PHP 代码

$sql = "select * from display where gp_no = '$gp_no' ";
$result = mysqli_query($conn, $sql);

$s_no = 1 ; 
if (mysqli_num_rows($result) > 0)
{


 $s = " select date,member_no  from bid where gp_no = '$gp_no ' order by member_no asc"; 
 $r = mysqli_query($conn, $s);
 if (mysqli_num_rows($r) > 0)
  {
    ?> <h1>Welcome !!! Details of GROUP NO : <?php echo $gp_no ;  ?></h1> 
     <table  align = center ; style="width:50%">
     <tr><th><?php echo " Group Number ";?> </th><td><?php echo $gp_no ; ?></td></tr>
     <tr><th><?php echo " Number of Members ";?> </th><td><?php echo $no_of_member ; ?></td></tr>
     <tr><th><?php echo " Amount ";?> </th><td><?php echo $amount ; ?></td></tr>
     <tr><th><?php echo " Starting Date ";?> </th><td><?php echo $starting_date ; ?></td></tr>
     <tr><th><?php echo " Current Instalment ";?> </th><td><?php echo $current_instalment ; ?></td></tr>
     </table>
     <table  align = center ; style="width:50%" id = " display">
    <tr><th><?php echo "  Sr. Number ";  ?> </th><th><?php echo "  Member Number ";  ?> </th><th><?php echo "  Member Name ";  ?> </th><th><?php echo "  Bid Withdraw ";  ?> </th></tr>
   <?php
   /*$row_count = mysqli_num_rows($result);
   $row1_count = mysqli_num_rows($r);
   $remaining_rows = max($row_count, $row1_count);
   while($remaining_rows-- > 0)
{
    $row = mysqli_fetch_assoc($result);
    $row1 = mysqli_fetch_assoc($r); */
     while($row1 = mysqli_fetch_assoc($r))
     {
         while($row = mysqli_fetch_assoc($result))
    { 


      ?>
     <tr>
        <td><?php echo $s_no ; ?></td>

        <td><?php echo $row["member_no"] ; ?></td>

        <td><?php echo $row["member_name"] ; ?></td>
    <?php
     if($row["member_no"] === $row1["member_no"])
    {
    ?>
       <td><?php echo $row1["date"] ; ?></td>
    <?php 
     }
    else
     { ?> 
       <td><?php echo " Not withdrawn "; ?></td> 
       <?php } ?> 
   </tr> 
  <?php
       $s_no = $s_no + 1;
        }
        } 
        ?>
  </table>  
      <?php 
        }
            } 
    else
    {
    ?> <h1>  Members not associated yet. </h1> <?php
    }
   }
  mysqli_close($conn);
 ?>

【问题讨论】:

  • 你可以在这里使用连接。
  • @HarshitShrivastava:怎么做?我的意思是我已经尝试了 Mak 建议的 left , inner join ,但它并没有按照我想要的方式工作。你能推荐一个布局吗?
  • 尝试我在答案中发布的查询。这应该工作

标签: php mysql comparison row html-table


【解决方案1】:

试试这个查询,它应该可以按照你的要求工作

SELECT d.member_no, d.member_name, IFNULL(b.date, 'NOT WITHDRAWN')
FROM display d LEFT JOIN bid b ON d.member_no = b.member_no
and b.gp_no='1' where d.gp_no='1'

【讨论】:

  • 是的,它正在工作,但不完全相同。它正在显示所有记录,但我想在gp_no = 1 的位置过滤它们。
  • 您只需添加一个 where 条件,即 where d.gp_no='1'。我已经更新了答案
  • 为此点赞好友。谢谢队友 :) 最后一个问题是它显示匹配的行两次。如何解决?
  • 我无法得到你的好友。请说明
  • 您可以使用按条件分组以避免多条记录
【解决方案2】:

试试这个

SELECT d.member_no,d.member_name,CASE WHEN b.date IS NULL THEN 'Not Withdraw' ELSE b.date END AS bidDate 
FROM display AS d 
LEFT JOIN bid AS b ON d.member_no=b.member_no AND d.starting_date = b.date
WHERE d.gp_no=1

【讨论】:

  • 感谢您的努力,但它并没有按照我想要的方式工作。 d.starting_date 对于表display 中的所有记录都是相同的,对于与一个组关联的所有成员来说,gp_no = 1。所以,它没有给出预期的结果。我无法在评论中添加图片,否则我会向您展示结果。
【解决方案3】:

试试这个查询

SELECT d.member_no,d.member_name,CASE WHEN b.date IS NULL THEN 'Not Withdraw' ELSE b.date END AS bidDate FROM display AS d LEFT JOIN bid AS b ON d.member_no=b.member_no WHERE d.gp_no=1

【讨论】:

  • 我遇到了与 Gautam 查询中相同的问题。它正在从投标中获取所有日期,但我只想要 gp_no = 1 的日期。即反对 member_no = 7 和 member_no = 16。
【解决方案4】:

为什么不使用 OUTER JOIN,类似这样的东西

SELECT d.member_no, b.date
FROM display d LEFT JOIN bid b ON d.member_no = b.member_no
WHERE d.gp_no = 1 AND b.gp_no = 1  

【讨论】:

  • 如果你使用内连接,那么只会显示两个表中匹配的条目。
  • 然后使用左连接,如果您想要显示的所有数据和出价的匹配数据。
  • 这是我使用您的查询得到的结果:
    mysql&gt; SELECT d.member_no, b.date FROM display d INNER JOIN bid b ON d.member_no = b.member_no WHERE d.gp_no = 1 AND b.gp_no = 1 ; +-----------+------------+ | member_no | date | +-----------+------------+ | 16 | 2015-05-01 | | 7 | 2015-06-01 | +-----------+------------+ 2 rows in set (0.00 sec)@MaK
  • 左连接也显示相同的 O/P 。这不是我想要的。我想要来自 display 的所有内容,并且只想要来自 bid 的 date 。现在我得到一个匹配 d.member_no = b.member_no 的地方,其中 d 和 b 分别是 displaybid,我希望显示来自 bid 的日期,否则它应该显示 Notwithdraw 。 @MaK
  • 感谢 Mate @Mak :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2021-03-12
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多