【问题标题】:MSQL + PHP - Check Query IssuesMYSQL + PHP - 检查查询问题
【发布时间】:2015-11-10 09:09:45
【问题描述】:

我有点问题...

所以我要做的是:

我有一个用户表:

-------------------------
|   Table: userlist     |
-------------------------
| Id |  GuestOf | User  |
|-----------------------|
| 0  | System   | Bill  |
|-----------------------|
| 1  |   Bill   | Jason |
|-----------------------|
| 2  |  Jason   | Jack  |
|-----------------------|
| 3  |  Jason   | Jill  |
|-----------------------|
| 4  |   Jack   | Matt  |
|-----------------------|
| 5  |   Jill   |  Stu  |
|-----------------------|
| 6  |   Jack   | Gwen  |
|-----------------------|
| 7  |   Jill   | Frank |
|-----------------------|

基本上,Jason 的客人是 Jack 和 Jill,Jack 的客人是 Matt 和 Gwen,Jill 的客人是 Stu 和 Frank。

现在我要做的是找出 Jason 的客人是否都有两个客人。

但我只能在每次将新客人添加到列表时检查这一点。在这种情况下,当 Frank 被 Jill 添加到列表中时。

这是我目前使用的代码:

function countGuests($User) {
  $sql = "SELECT COUNT(`Id`) CntId FROM `userlist` WHERE `GuestOf` LIKE '$User'";

  $res = mysql_query($sql);

  $temp = mysql_fetch_array($res, MYSQL_BOTH);

  return $temp["CntId"];        
}

function checkCompletion($UserId) {
  $population = array();

  $sql = "SELECT `User` FROM `userlist` WHERE `GuestOf` LIKE '$UserId'";

  $res = mysql_query($sql);

  if (mysql_num_rows($res) > 0) {
    while ($temp = mysql_fetch_array($res, MYSQL_BOTH)) {
      $population[] = $temp["User"];      
    }

    $partialPop = 0;

    for ($i = 0; $i < count($populaton); ++$i) {
        $partialPop = $partialPop + countGuests($population[$i]);
    }
  }

  return $partialPop;
}

结果应该是:7(Jason、Jack、Jill、Matt、Gwen、Stu、Frank)

但是,我得到的结果是:0。我的查询有什么问题?

如果有任何帮助/更正,我将不胜感激......

谢谢!

【问题讨论】:

  • 你考虑过重建你的数据库吗?关系的奇怪方法
  • 您应该创建一个包含客人关系的表格。在这个基本示例中没有太大区别,但是当您开始向表中添加信息(性别、地址、日期等)时,这个问题很重要。
  • AFAIK,这个表是分层的。看看这个 id = 0 (system): 是所有结构的根。您缺少重要信息。请求的信息是检索系统中所有客人的列表???如果这是问题,您应该从考虑递归函数开始。
  • @RaulLuna:我想知道 Jason 的客人(杰克和吉尔)是否各有 2 位客人。比尔进来的时候没有其他人,所以他是系统的客人。
  • @Strawberry:不,这个说法是正确的。弗兰克是用户,他是吉尔的客人。所以当弗兰克作为吉尔的客人进入名单时......

标签: php mysql


【解决方案1】:

考虑以下问题。我已更改列/表名称以简化概念化...

DROP TABLE IF EXISTS guestlist;

CREATE TABLE guestlist
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,user VARCHAR(12) NOT NULL
,guest VARCHAR(12) NOT NULL
,UNIQUE(user,guest)
);

INSERT INTO guestlist VALUES
(1,'System','Bill'),
(2,'Bill','Jason'),
(3,'Jason','Jack'),
(4,'Jason','Jill'),
(5,'Jack','Matt'),
(6,'Jill','Stu'),
(7,'Jack','Gwen'),
(8,'Jill','Frank');

SELECT a.user
     , a.guest
     , GROUP_CONCAT(b.guest) guest_of_guest
     , COUNT(*) total 
  FROM guestlist a 
  LEFT 
  JOIN guestlist b 
    ON b.user = a.guest 
 WHERE a.user = 'Jason' 
 GROUP 
    BY user
     , guest;
+-------+-------+----------------+-------+
| user  | guest | guest_of_guest | total |
+-------+-------+----------------+-------+
| Jason | Jack  | Gwen,Matt      |     2 |
| Jason | Jill  | Frank,Stu      |     2 |
+-------+-------+----------------+-------+
2 rows in set (0.00 sec)

【讨论】:

    【解决方案2】:

    如果问题是你必须遍历层次表中的所有节点,你应该考虑递归函数而不是迭代函数。

    以下是检索所有用户(包括系统)列表的函数的概要:

    你必须用一个空数组调用这个函数,我希望结果在同一个数组中返回,但我不确定php中是否是这种情况......

    function retrieveAllUsers($UserId, $population) {
    
      $sql = "SELECT `User` FROM `guestlist` WHERE `Guest` LIKE '$UserId'";
    
      $res = mysql_query($sql);
    
      if (mysql_num_rows($res) > 0) {
        temp = mysql_fetch_array($res, MYSQL_BOTH);
        // traverse the array $temp
        // in every iteration....
           // push into $population the value $temp["User"];      
           retrieveAllUsers( $currentUser, $population ); 
    
        }
      }
    
    }
    

    【讨论】:

    • 我不想遍历表中的所有节点。我只想知道 Jack 是否有 2 位客人,而 Jill 是否有 2 位客人。基本上,当添加 Frank 时,因为我知道他是 Jill 的客人,所以检查谁来了 Jill,然后让合作伙伴客人(Jack)并检查他是否也是 2 位客人......
    • @JonDavis Jill 绝对是弗兰克的客人!
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2011-06-12
    • 1970-01-01
    • 2015-09-15
    • 2012-04-15
    相关资源
    最近更新 更多