Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不确定如何进行正确的mySQL查询,以便在一个查询中从多个表中获取数据_Mysql_Database - Fatal编程技术网

不确定如何进行正确的mySQL查询,以便在一个查询中从多个表中获取数据

不确定如何进行正确的mySQL查询,以便在一个查询中从多个表中获取数据,mysql,database,Mysql,Database,我需要从一个数据库的多个表中获取数据,我需要使用一个查询,但我无法让它工作 我拿到了这些桌子: 项目: 使用者 用户有一个项目 任务 所以我需要做的是做一个查询,它会给我这个结果: 结果: 我让它一直工作到我需要计算一个项目有多少任务的那一部分。 我得到了这个查询,但这不起作用: SELECT projects.id, projects.name, projects.start_date, projects.end_date, projects.finished, users.us

我需要从一个数据库的多个表中获取数据,我需要使用一个查询,但我无法让它工作

我拿到了这些桌子:
项目:

使用者

用户有一个项目

任务

所以我需要做的是做一个查询,它会给我这个结果:
结果:

我让它一直工作到我需要计算一个项目有多少任务的那一部分。 我得到了这个查询,但这不起作用:

SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects, tasks
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON projects.project_leader = users.id
WHERE user_has_project.userId = 1
SQL转储,以便人们可以尝试为我测试他们的查询:

-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 20 aug 2012 om 19:42
-- Serverversie: 5.5.16
-- PHP-Versie: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `project-deadline`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `projects`
--

CREATE TABLE IF NOT EXISTS `projects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `start_date` datetime DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `project_leader` int(11) DEFAULT NULL,
  `finished` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `projects`
--

INSERT INTO `projects` (`id`, `name`, `start_date`, `end_date`, `project_leader`, `finished`) VALUES
(1, 'Project 1', '2012-08-01 00:00:00', '2012-09-18 00:00:00', 1, 0);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `tasks`
--

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project` int(11) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `user` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(100) NOT NULL,
  `status` int(11) NOT NULL,
  `timezone` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `users`
--

INSERT INTO `users` (`id`, `username`, `password`, `email`, `status`, `timezone`) VALUES
(1, 'DijkeMark', '37540da17c71d40c656b97b32c00f692', 'mark.dijkema@gmail.com', 1, 'UP1');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `user_has_project`
--

CREATE TABLE IF NOT EXISTS `user_has_project` (
  `userId` int(11) NOT NULL,
  `projectId` int(11) NOT NULL,
  PRIMARY KEY (`userId`,`projectId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden uitgevoerd voor tabel `user_has_project`
--

INSERT INTO `user_has_project` (`userId`, `projectId`) VALUES
(1, 1),
(1, 6);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

当将聚合函数i-e COUNT()与其他col一起使用时,必须使用group by子句。还有一件事,我还将查询模式化如下:; 当您想从GROUPBY子句中筛选某些内容时,请记住使用HAVING子句而不是WHERE子句

SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects 
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON user_has_project.userid = users.id
INNER JOIN tasks ON users.id = task.user
GROUP BY projects.id, projects.name, projects.start_date, projects.end_date, 
         projects.finished, project_leader
HAVing user_has_project.userid = 1

注意:请根据您的需要修改此查询,我认为这对您肯定有用。

它给了我一个错误:#1054-未知列“user\u has\u project.userId”在“having子句”中“我没有键入cols name I-e”user\u has\u project.userId“检查我键入的所有cols name carefullySorry mate,但是这个不行。它给出了一个空的结果。我验证了查询,它应该是正确的,但是没有一些数据库来尝试它,我无法完全验证它。您能否为我们提供一个小的sql脚本来重新创建您的DB(结构和数据)的一小部分,并在其上尝试查询?鉴于您提供给我们的转储中的
tasks
表为空,空结果实际上是正确的。我在
任务
表上使用
左连接
修改了查询,因此如果查询为空,它应该仍然可以工作,请立即尝试@Dijkemark这是有效的。非常感谢你。我仍然需要提高我的mySQL技能。:)你能给我们提供一个SQL脚本,在我们自己的服务器上重新创建部分数据库(结构和数据)来测试查询吗?好的,我在我的主要帖子中添加了SQL转储。在你添加的转储中,
tasks
表是空的,所以难怪你的查询(以及我的,基于你的查询)返回一个空结果集,事实上,这将是正确的结果。
SELECT projects.id,
        projects.name,
        projects.start_date,
        projects.end_date,
        projects.finished,
        users.username AS project_leader,
        COUNT(tasks.id) AS tasks
FROM projects
LEFT JOIN tasks ON (tasks.project = projects.id)
JOIN user_has_project ON (user_has_project.projectId = projects.id)
JOIN users ON (projects.project_leader = users.id)
WHERE user_has_project.userId = 1
GROUP BY projects.id
project_id  project_name    start_date           end_date             project_leader    finished       tasks
1           project_1       2012-08-01 00:00:00  2012-29-01 00:00:00  user_2            0              2  
SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects, tasks
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON projects.project_leader = users.id
WHERE user_has_project.userId = 1
-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 20 aug 2012 om 19:42
-- Serverversie: 5.5.16
-- PHP-Versie: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `project-deadline`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `projects`
--

CREATE TABLE IF NOT EXISTS `projects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `start_date` datetime DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `project_leader` int(11) DEFAULT NULL,
  `finished` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `projects`
--

INSERT INTO `projects` (`id`, `name`, `start_date`, `end_date`, `project_leader`, `finished`) VALUES
(1, 'Project 1', '2012-08-01 00:00:00', '2012-09-18 00:00:00', 1, 0);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `tasks`
--

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project` int(11) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `user` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(100) NOT NULL,
  `status` int(11) NOT NULL,
  `timezone` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `users`
--

INSERT INTO `users` (`id`, `username`, `password`, `email`, `status`, `timezone`) VALUES
(1, 'DijkeMark', '37540da17c71d40c656b97b32c00f692', 'mark.dijkema@gmail.com', 1, 'UP1');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `user_has_project`
--

CREATE TABLE IF NOT EXISTS `user_has_project` (
  `userId` int(11) NOT NULL,
  `projectId` int(11) NOT NULL,
  PRIMARY KEY (`userId`,`projectId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden uitgevoerd voor tabel `user_has_project`
--

INSERT INTO `user_has_project` (`userId`, `projectId`) VALUES
(1, 1),
(1, 6);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects 
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON user_has_project.userid = users.id
INNER JOIN tasks ON users.id = task.user
GROUP BY projects.id, projects.name, projects.start_date, projects.end_date, 
         projects.finished, project_leader
HAVing user_has_project.userid = 1
SELECT projects.id,
        projects.name,
        projects.start_date,
        projects.end_date,
        projects.finished,
        users.username AS project_leader,
        COUNT(tasks.id) AS tasks
FROM projects
LEFT JOIN tasks ON (tasks.project = projects.id)
JOIN user_has_project ON (user_has_project.projectId = projects.id)
JOIN users ON (projects.project_leader = users.id)
WHERE user_has_project.userId = 1
GROUP BY projects.id