Php 使用MySQL示例员工数据库进行SQL查询
我在进行高级(对我而言)查询时遇到问题 我想知道经理的名字、姓氏、职务、部门名称以及姓名。如果出于某种原因您需要知道,我正在PHP中使用此SQL。我限制为10个,因为数据库非常庞大。我只需要输入员工的最新数据。由于工作晋升等原因,他们有多个条目 我包括了所有我认为你需要了解我的问题的东西。如果你能帮忙,谢谢你Php 使用MySQL示例员工数据库进行SQL查询,php,mysql,sql,Php,Mysql,Sql,我在进行高级(对我而言)查询时遇到问题 我想知道经理的名字、姓氏、职务、部门名称以及姓名。如果出于某种原因您需要知道,我正在PHP中使用此SQL。我限制为10个,因为数据库非常庞大。我只需要输入员工的最新数据。由于工作晋升等原因,他们有多个条目 我包括了所有我认为你需要了解我的问题的东西。如果你能帮忙,谢谢你 mysql> SELECT DISTINCT employees.first_name, employees.last_name, titles.title, departments
mysql>
SELECT DISTINCT employees.first_name, employees.last_name,
titles.title, departments.dept_name, z.first, z.last
FROM employees, dept_emp, departments, titles,
(
SELECT employees.first_name AS first, employees.last_name AS last
FROM employees, dept_emp, dept_manager
WHERE
employees.emp_no = dept_emp.emp_no
AND dept_manager.emp_no = dept_emp.emp_no
) AS z
WHERE
employees.emp_no = dept_emp.emp_no
AND dept_emp.dept_no = departments.dept_no
AND titles.emp_no = employees.emp_no
LIMIT 10;
+------------+-----------+-----------------+-------------+-----------+--------------+
| first_name | last_name | title | dept_name | first | last |
+------------+-----------+-----------------+-------------+-----------+--------------+
| Georgi | Facello | Senior Engineer | Development | Margareta | Markovitch |
| Georgi | Facello | Senior Engineer | Development | Vishwani | Minakawa |
| Georgi | Facello | Senior Engineer | Development | Ebru | Alpin |
| Georgi | Facello | Senior Engineer | Development | Isamu | Legleitner |
| Georgi | Facello | Senior Engineer | Development | Shirish | Ossenbruggen |
| Georgi | Facello | Senior Engineer | Development | Karsten | Sigstam |
| Georgi | Facello | Senior Engineer | Development | Krassimir | Wegerle |
| Georgi | Facello | Senior Engineer | Development | Rosine | Cools |
| Georgi | Facello | Senior Engineer | Development | Shem | Kieras |
| Georgi | Facello | Senior Engineer | Development | Oscar | Ghazalie |
+------------+-----------+-----------------+-------------+-----------+--------------+
10 rows in set (0.00 sec)
该数据库是mysql.com上的员工数据库:
我想知道经理的名字、姓氏、职务、部门名称以及姓名
使用这个理论(但是如果你有大的表,它可能不会被优化),一步一步地做。假设您有一个包含日期的$date
PHP变量(如date('Y-m-d 00:00:00')
),否则您可以使用MySQL的日期
1/获取员工身份:
SELECT
e.first_name,
e.last_name
FROM
employees AS e
WHERE
1
2/添加他/她的当前职务
SELECT
e.first_name,
e.last_name,
t.title
FROM
employees AS e,
titles AS t
WHERE
e.emp_no=t.emp_no AND t.from_date<='$date' AND t.to_date>='$date'
4/获取部门经理(从部门经理
)并检索其姓名(从员工
)
希望这有帮助:)那么,有什么问题吗?您是否收到错误消息?结果与您期望的结果不同?另外,请参阅以获取降价概述,并在编辑帖子时查看工具栏中的“?”。同时将鼠标悬停在图标上,查看它们的功能。有一种方法,您可以选择一个文本块来转换为“代码块”(这是通过缩进四个空格来完成的)。它看起来像一对大括号。
{}
。为了可读性,我编辑了你的文章,接受它。就像Ben Lee说的,你有什么问题?我的问题是我不能正确分组。当我只想要最后一个最新的条目时,它多次使用Georgi Facello。之前对于其他查询,我是按titles.from_date DESC和LIMIT 1进行排序的,但在这种情况下我不能这样做。这确实有帮助。事实上相当多。我确实想做一个限制和排序,因为我将排序它,例如,列出所有-使用分页限制的50或左右,排序由一个或多个部门只。。。当我通过empFN LIMIT 10或类似的方式添加ORDER时,MySQL会停止运行。顺便问一下,我在MySQL中试过这个,但不是在PHP网站上。你说它会暂停是什么意思?MySQL崩溃?日志中有什么内容(特别是关于机制:日志和配置)?无论如何,如果您的目标是按部门排序(不确定您的“一个或多个”部分应该理解什么),请使用ORDER by
和dept\u no
:在任何情况下,请避免在ORDER by
中使用非索引字段(和员工。名字可能没有索引),特别是当它所应用的请求返回巨大的结果时,因为这会使它“更慢”(我的意思是非常慢)。无论如何,你可以做的是,因为这是一个非常繁重的请求,在每次重新加载页面时使用或避免发送这个大的错误请求。这样,您从PHP页面的请求将非常快(基本上类似于从您的\u视图中选择*,其中1 ORDER BY some \u field LIMIT$offset,10
)。查看优点:在服务器上一次性创建;缺点:没有索引。诱人的优点:可以定义索引;缺点:仅在连接期间创建。
SELECT
e.first_name,
e.last_name,
t.title
FROM
employees AS e,
titles AS t
WHERE
e.emp_no=t.emp_no AND t.from_date<='$date' AND t.to_date>='$date'
SELECT
e.first_name,
e.last_name, t.title,
d.dept_name
FROM
employees AS e,
titles AS t,
dept_emp AS de,
departments as d
WHERE
e.emp_no=t.emp_no AND t.from_date<='$date' AND t.to_date>='$date'
AND
e.emp_no=de.emp_no AND de.from_date<='$date' AND de.to_date>='$date'
AND
d.dept_no=de.dept_no
SELECT
e.first_name AS empFN,
e.last_name AS empLN,
t.title AS empT,
d.dept_name AS dept,
em.first_name AS manFN,
em.last_name AS manLN
FROM
employees AS e,
titles AS t,
dept_emp AS de,
departments as d,
dept_manager AS dm,
employees AS em
WHERE
e.emp_no=t.emp_no AND t.from_date<='$date' AND t.to_date>='$date'
AND
e.emp_no=de.emp_no AND de.from_date<='$date' AND de.to_date>='$date'
AND
d.dept_no=de.dept_no
AND
em.emp_no=dm.emp_no AND dm.from_date<='$date' AND dm.to_date>='$date'
AND
de.dept_no=dm.dept_no
$dateString="from_date<='$date' AND to_date>='$date'";
$qe=query("SELECT emp_no, first_name, last_name, dept_no FROM employees, dept_emp WHERE dept_emp.emp_no=employees.emp_no LIMIT 10 ORDER BY emp_no DESC");
while($r=fetch($qe)) {
$qt=fetch(query("SELECT title FROM titles WHERE emp_no=".$qe['emp_no']." AND ".$dateString));
$qd=fetch(query("SELECT dept_name FROM departments WHERE dept_no=".$qe['dept_no']." AND ".$dateString));
$qm=fetch(query("SELECT first_name, last_name FROM employees AS e, dept_manager AS dm WHERE dept_no=".$qe['dept_no']." AND e.emp_no=dm.emp_no AND ".$dateString));
//echo/process here
}