Php 使用MySQL示例员工数据库进行SQL查询

Php 使用MySQL示例员工数据库进行SQL查询,php,mysql,sql,Php,Mysql,Sql,我在进行高级(对我而言)查询时遇到问题 我想知道经理的名字、姓氏、职务、部门名称以及姓名。如果出于某种原因您需要知道,我正在PHP中使用此SQL。我限制为10个,因为数据库非常庞大。我只需要输入员工的最新数据。由于工作晋升等原因,他们有多个条目 我包括了所有我认为你需要了解我的问题的东西。如果你能帮忙,谢谢你 mysql> SELECT DISTINCT employees.first_name, employees.last_name, titles.title, departments

我在进行高级(对我而言)查询时遇到问题

我想知道经理的名字、姓氏、职务、部门名称以及姓名。如果出于某种原因您需要知道,我正在PHP中使用此SQL。我限制为10个,因为数据库非常庞大。我只需要输入员工的最新数据。由于工作晋升等原因,他们有多个条目

我包括了所有我认为你需要了解我的问题的东西。如果你能帮忙,谢谢你

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
}