我有下面三张表,希望从中获得以下选择:
1。)从collaboration
中选择所有项目,并在group_members
中按group_id
对给定用户进行分组
这意味着当用户登录时,他将看到属于他所属组的所有(且仅限于)collaboration
项目
2.)对于每个组id
,选择所有协作项目
这意味着当用户从上面的1中选择任何组(group_id
)时,他将看到属于所选组(group_id
)的所有collaboration
项目
约束:每个用户必须是组成员。users
表用于提供用户的firstname
和lastname
这是我尝试过的,但是没有用
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的请求。然而,我知道查询不是最优的,因为我确实选择了目前不需要的条目。例如,*
我只想选择标题
,内容
,时间戳
,组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