在mysql中选择父级中所有可能的子级

时间:2012-06-01 18:43:38

标签: php mysql

我有一个用户表。 我有一张认证表​​。

每个用户都可以拥有多个认证。认证有一个user_id外键。

  1. 如何在一个查询中选择用户及其所有认证?
  2. 如何选择拥有认证的用户?
  3. 用户表:

    CREATE TABLE `users` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `username` varchar(24) default NULL,
      `displayname` varchar(24) default NULL,
      `email` varchar(64) default NULL,
      `password` text,
      `signup_date` int(11) default NULL,
      `signup_ip` varchar(15) default NULL,
      `hash` text,
      `verified` tinyint(1) default '0',
      `last_login` int(11) default NULL,
      `logins` int(11) default NULL,
      `status` text,
      `recovery_hash` text,
      `recovery_initiated` int(11) default NULL,
      `last_updated` int(11) default NULL,
      `signup_method` text,
      `signup_question` int(11) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    

    认证表:

    CREATE TABLE `certifications` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `user_id` int(11) unsigned NOT NULL,
      `number` varchar(128) default NULL,
      `board` varchar(128) default NULL,
      `company` varchar(128) default NULL,
      `website` varchar(128) default NULL,
      PRIMARY KEY  (`id`),
      KEY `user_id` (`user_id`),
      CONSTRAINT `certifications_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    

    感谢您的阅读。

2 个答案:

答案 0 :(得分:3)

使用联接获取id为1的用户的所有认证。

SELECT b.id as certification_id 
FROM users AS a
LEFT JOIN certifications AS b
ON a.id = b.user_id
WHERE a.id = 1;

使用内部联接获取拥有认证的所有用户。没有证书的所有用户都将退出。

SELECT a.id as users_with_certifications
FROM users as a
JOIN certifications AS b
ON a.id = b.user_id; 

答案 1 :(得分:3)

如何在一个查询中选择用户及其所有认证?

SELECT *
FROM certifivations C
LEFT JOIN users U
ON C.user_id = U.id
WHERE U.id=USERID

如何选择拥有认证的用户?

SELECT *
FROM certifivations C
JOIN users U
ON C.user_id = U.id
GROUP BY U.id