当前位置: 首页 > 知识库问答 >
问题:

从三个表中进行选择——mysql和php

钱欣然
2023-03-14

我有下面三张表,希望从中获得以下选择:

1。)从collaboration中选择所有项目,并在group_members中按group_id对给定用户进行分组
这意味着当用户登录时,他将看到属于他所属组的所有(且仅限于)collaboration项目

2.)对于每个组id,选择所有协作项目
这意味着当用户从上面的1中选择任何组(group_id)时,他将看到属于所选组(group_id)的所有collaboration项目

约束:每个用户必须是组成员。users表用于提供用户的firstnamelastname

这是我尝试过的,但是没有用




    function OrderByGroup_id($username) {
      $data = array();
      $currenttime = time();
      $q = "
      SELECT *
      FROM collaboration
      INNER JOIN group_members ON collaboration.group_id = group_members.group_id
      INNER JOIN users ON users.username = group_members.username
      WHERE collaboration.parent_id IS NULL and collaboration.is_comment = 0 
      AND group_members.username = :user group by collaboration.group_id";
      $sq = $this->connection->prepare($q);
      $sq->execute(array(':user' => $username));
    while($row = $sq->fetch()) {
      $json = array();
      $json['title'] = $row['title'];
      $json['question'] = $row['content'];
      $json['firstname'] = $row['firstname'];
      $json['lastname'] = $row['lastname'];
      $json['timestamp'] = $row['timestamp'];
      $json['key'] = $row['group_id'];
      $data[] = $json;
     }
      $allposts =json_encode($data);
      return $allposts= json_decode($allposts, true);
    }


这是桌子


CREATE TABLE IF NOT EXISTS `collaboration` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `group_id` varchar(255) DEFAULT NULL,
  `author` varchar(30) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  `is_comment` tinyint(1) unsigned NOT NULL,
  `file` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `points` int(11) DEFAULT NULL,
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `users` (
  `firstname` varchar(30) NOT NULL,
  `lastname` varchar(30) NOT NULL,
  `username` varchar(30) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `group_members` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `group_id` varchar(50) NOT NULL,
  `status` tinyint(1) unsigned NOT NULL,
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

谢谢你的意见!

共有1个答案

夏学名
2023-03-14

以下选择确实提供了问题1的请求。然而,我知道查询不是最优的,因为我确实选择了目前不需要的条目。例如,*
我只想选择标题内容时间戳组id,从协作名字名字,从用户

    
    SELECT * FROM collaboration
    INNER JOIN group_members ON collaboration.group_id = group_members.group_id
    INNER JOIN users ON users.username = collaboration.author
    WHERE collaboration.parent_id IS NULL and collaboration.is_comment = 0 
    AND group_members.username = :user 
    GROUP BY collaboration.group_id
    ORDER BY collaboration.timestamp DESC

 类似资料:
  • 问题内容: 如何编写SQL语句从三个表中选择数据? 问题答案: 使用联接 这将要求每个表都有一个table_1_id键,并且每个表中都有一个条目。 如果table_2或table_3可能没有数据,但您仍想显示来自table_1的数据,则可以使用LEFT JOIN

  • 我的数据库中有两个表。一个表包含有关用户的信息,而另一个表包含有关预订的数据。当用户进行预订时,userid将被放置在预订表中。现在,我想展示一张用户的照片,其中包括预订的备注和日期,但是照片在users表中。 这是我的两张桌子: null null

  • 问题内容: 我正在使用PHP和MySQL创建一个简单的Web应用程序。在其中,我需要以随机顺序从表中随机选择一小组行。如何使用MySQL实现此类目标? 问题答案: SELECT * FROM table ORDER BY RAND() LIMIT 10;

  • 问题内容: 这是我的代码: 您可以看到我要执行的操作,但是我不确定如何正确编写此查询。 我得到的继承人错误: 警告:mysql_fetch_assoc():提供的参数不是有效的MySQL结果资源 这是我的mysql_fetch_assoc: 问题答案: 尝试改变…的喜欢 …至…

  • 问题内容: 如何选择一个表中所有未出现在另一表中的行? 表格1: 表2: 表1中不在表2中的行的示例输出: 也许这样的事情应该工作: 问题答案: 如果您在另一条注释中提到有300列,并且想要对所有列进行比较(假设这些列的名称相同),则可以使用a 隐式联接两个表之间所有匹配的列名称,以便不必繁琐地手动输入所有加入条件:

  • 问题内容: 产生5行(5个数组),是一行中唯一的唯一字段。重复( 在这里 重复3次。 )我如何摆脱这些重复? 编辑: 我想要和所有为每个饮料。 问题答案: 您在这里所做的称为a (尽管您是隐式执行的,因为您是从多个表中选择的)。这意味着,如果您未在WHERE子句中放置任何条件,则您将拥有这些表的 所有组合 。仅根据您的条件,您才可以将联接限制为饮料ID匹配的行。 但是,如果有X张包含此特定Drin