我有两张结构非常相似的桌子。
Universidades
nombre | contenido | becas | fotos etc etc etc
Internados
nombre | todo | becas | fotos etc etc etc
我想编写一个SQL语句,它将从它们中选择nombre
并仅在匹配时将其作为数组返回。从我所看到的UNION SELECT
似乎是这样做的方式。我在最后添加了WHERE
,我认为这是出错的地方。到目前为止,我收到了第一张表的第一行。
我输错了什么?
$db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
$data = $db->prepare("SELECT nombre FROM internados UNION SELECT nombre FROM universidades WHERE nombre = ?");
$data->execute(array($nombre));
道歉,我想从这两个表中检索一个结果。 nombre
列中的名称在两个表中都是个体和不同的
答案 0 :(得分:20)
在我们解决问题之前要指出的一个问题是UNION
中的每个查询都是不同的,并且需要自己的WHERE
子句。适用于UNION
整体的唯一条款是ORDER BY
。所以你的查询需要一些调整:
SELECT nombre
FROM dbo.internados
WHERE nombre = ? -- the added line
UNION
SELECT nombre
FROM dbo.universidades
WHERE nombre = ?
;
其次,如果你想要两个表都具有相同的nombre
(这不是很清楚,但我猜是正确的),那么这将无法工作,因为它只返回一个{{1如果在 表中找到该值。解决这个问题的最佳方法可能就是加入:
nombre
我并不是100%确定我完全理解你在寻找什么,所以如果我错过了标记,请说出来。
您可以这样考虑SELECT I.nombre
FROM
dbo.internados I
INNER JOIN dbo.universidades U
ON I.nombre = U.nombre
WHERE
I.nombre = ?
AND U.nombre = ? -- perhaps not needed, but perhaps helpful
;
和JOIN
:
UNION
:水平连接行
JOIN
),那么你可以得到一个笛卡尔积,它是一个输入中的每一行与另一行中的每一行匹配。CROSS JOIN
加入时,OUTER
,LEFT
,RIGHT
- 来自内部输入的行(或使用FULL
输入的行)与其他输入不匹配,FULL
将被放入另一个输入的列中。NULL
:垂直堆叠行
UNION
本身(不是UNION
)将删除重复的行,即使一个输入没有行请注意,可以修改UNION ALL
来完成这项工作,但这并不理想:
UNION
通过这种方式,我们确保有两个值。请注意,这假设每个表中不能有两个相同的名称。如果这是真的,那么需要做更多工作才能使SELECT nombre
FROM (
SELECT nombre
FROM dbo.internados
WHERE nombre = ?
UNION ALL
SELECT nombre
FROM dbo.universidades
WHERE nombre = ?
) N
GROUP BY nombre
HAVING Count(*) = 2
;
方法完成工作。
答案 1 :(得分:5)
大多数情况下,通过加入可以实现union
:
SELECT nombre
FROM internados
UNION
SELECT nombre
FROM universidades
WHERE nombre = ?
最好是:
SELECT nombre
FROM internados i
JOIN universidades u
ON i.nombre = u.nombre
AND nombre = ?
这样更容易阅读。 (您也可以使用JOIN
语法,但我更喜欢普通的旧手动连接。
但无论这是union
还是join
,请始终记住两个表都会在结果中合并:
nombre | todo | becas | fotos | ... | contenido | becas | ...
所以基本上,当你在nombre上设置一个条件时,你要么得到一个空集,要么给你给查询的名字。但是,按照你编写联合的方式,只有第二组应用了where
条件,而不是第一组。你应该把条件放在工会的两个问题上:
SELECT nombre
FROM internados
WHERE nombre = ?
UNION
SELECT nombre
FROM universidades
WHERE nombre = ?