2017-01-01 106 views
1

我无法理解连接和子查询以及何时使用它们。我确信其中一个在这里是适当的。查询多个SQL表

我有一张表(“所有者”)(为了简单起见)单元号,名称和电子邮件地址。

我有另一个表格(“小部件”)的单元号和小部件分配给每个单元的数量。每个单位有0,1或2个小部件。

我需要发送一封电子邮件给每个单元,具体取决于他们是否有0,1或2个小工具。换句话说(和简单的英语,丝毫没有在半正确的SQL的尝试):

select numwidgets from widgets where unit=x 
then where owners.unit = widgets.unit 
select unit, name, email 

,我需要传递给我的脚本看起来像这样的数据:

unit  name   email    widgets 
1  Bob Smith  [email protected]  2 

我可以想象我需要的数据,但它是从两个不同的表中提取出来的,这是问题所在。 “所有者”表格是永久性表格,“小部件”表格是用于跟踪我发送的电子邮件中正在解决的特定问题的临时表格。我不需要帮助发送电子邮件,只需创建我需要用于为一封电子邮件提取数据(numwidgets,姓名,电子邮件)的SQL。

感谢。

编辑:

输入数据:

owners table: 
unit, name, email 
1,Bob Smith, [email protected] 

widgets table: 
unit,widgets 
1,2 
+0

您可以发布样本输入数据和问题的预期输出? – GurV

+0

@Gurwinder预期的输出在我的原始文章中。如果上面的数据不一样,我只是重新排序,我不清楚你的意思是“样本输入数据”。预期输出(“我需要传递给我的脚本的数据”)包含在数据库中,与输出相同,只是在不同的表中。 – CraigH

+0

不,我的意思是你需要从某些输入数据构建的上述输出。请发布。 – GurV

回答

0

尝试此,一个内,只要有两个表中的列之间的匹配连接选择两个表中的所有行。

子查询(也称为内部查询或嵌套查询)是一种用于在多个步骤中执行操作的工具。例如,如果您想获得多列的总和,然后对所有这些值求平均值,则需要在不同的步骤中完成每个聚合。

select owners.unit, name, email, widgets.numwidgets 
from owners 
inner join widgets On owners.unit = widgets.unit 
where owners.unit = x 
+0

谢谢。这直接在数据库上工作 - 所以技术上解决了我的问题 - 但我的PHP脚本仍然被破坏。我需要明天回复这个,然后在我全力以赴时结束这个问题。 – CraigH

0

我想你想:

select o.*, w.widgets 
from owners o 
inner join widget w 
on o.unit = w.unit 
where o.unit = 123; 
+0

最好将条件放在'WHERE'子句中的单个表上,'ON'应该是表之间的关系(除了'OUTER JOIN')。 – Barmar

+0

谢谢@GurwinderSingh。这可能是错误的地方要问,但是你能解释还是建议阅读单字母“o”和“w”语法?这使我在其他搜索结果中感到困惑。我猜它与表名的第一个字母有关,但如果我有两个以相同字母开头的表 - 例如“owners”和“owners_test”,后者是“所有者”的缩写副本,结构相同但数据不同。 – CraigH

+0

这只是表的别名。它可以是任何东西...... t,x,abcd。这是为了方便编写更大的连接,以便您不必一遍又一遍地编写'very_very_big_table_name.some_column_name' – GurV

0

对于你的情况,你需要一个内部联接。要理解你需要看到非常简单的键的概念。 在您的表格中,unitnumber是两个表格中的公共列。因此,必须根据此列应用联接。当一个查询的输出被作为输入提供到另一个查询即从所有者执行相关操作

选择o.unit,o.name,o.email,w.numwidgetsö内加入

子查询中使用在o.unit = w.unit部件w其中w.unit = X

在上面的查询通X = 0,1,2按照结果你想

感谢

+0

谢谢。这有效,但我会接受第一个答案。 – CraigH

+0

没问题............................ :) – user3331349