【问题标题】:Learning SQL: Query for rows in diff tables based on if a column value is set学习SQL:根据是否设置列值查询不同表中的行
【发布时间】:2019-02-06 18:39:18
【问题描述】:

我正在做一个辅助项目来帮助我学习 SQL。

我设置了 2 个不同的表:

computers
+------------------+-----------+------+-----+---------+-------+
│| Field            | Type      | Null | Key | Default | Extra |
│+------------------+-----------+------+-----+---------+-------+
│| serial_number    | char(25)  | NO   | PRI | NULL    |       |
│| operating_system | char(10)  | YES  |     | NULL    |       |
│| purchase_year    | int(4)    | YES  |     | NULL    |       |
│| assigned_to      | char(100) | YES  |     | NULL    |       |
│+------------------+-----------+------+-----+---------+-------+

employees
│+------------+-----------+------+-----+---------+-------+
│| Field      | Type      | Null | Key | Default | Extra |
│+------------+-----------+------+-----+---------+-------+
│| email      | char(100) | NO   | PRI | NULL    |       |
│| first_name | char(25)  | NO   |     | NULL    |       |
│| last_name  | char(25)  | NO   |     | NULL    |       |
│| office     | char(5)   | NO   |     | NULL    |       |
│| assigned   | char(25)  | YES  |     | NULL    |       |
│+------------+-----------+------+-----+---------+-------+

在我进行测试时,它们都有一些条目,但是在尝试根据员工电子邮件编写搜索功能时,我遇到了 SQL 查询的障碍。我正在翻阅文档,但没有很好地理解它,也找不到一个很好的例子来说明我正在尝试做的事情。

这是我尝试对查询执行的操作: 我想获取与提供的电子邮件地址匹配的员工行,如果设置了“employees.assigned”字段(不为空,认为使用了 EXIST?),那么我还想获取“computers.serial_number”行匹配该列值

我可以用 2 个单独的查询来做我想做的事,但我想看看是否可以只用一个来清理代码并使查询尽可能快。也非常欢迎您认为对这个项目有价值的任何进一步文档!

【问题讨论】:

  • 应该提到与mysql一起工作的代码语言是PHP
  • 有点不清楚分配的列是如何链接两个表的,但您可能正在寻找外连接,它不需要另一个表匹配并且会为其列返回空值如果没有匹配。
  • 链接是 employees.assigned 将包含计算机的序列号。
  • @SamiKuhmonen 这是我现在正在尝试的选择查询,但出现语法错误:SELECT * FROM employees FULL OUTER JOIN computer ON employees.assigned=computers.serial_number;
  • 我意识到完全外连接可能是错误的使用,似乎它从阅读文档中返回所有内容 /*EDIT*/ YES,使用左或右给我一些结果。现在我需要缩小查询范围,只给出我想要的字段

标签: mysql database search


【解决方案1】:

对于那些在谷歌上找到这个的人:

我发现满足我的需要:

SELECT * FROM employees LEFT JOIN computers ON employees.assigned=computers.serial_number WHERE email='email@example.com';

【讨论】:

  • 很想知道是否有更清洁或更好的方法来做到这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多