我有两个结构非常相似的表.
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列中的名称在两个表中都是单独的和不同的
解决方法
在解决问题之前要指出的一个问题是UNION中的每个查询都是不同的,并且需要自己的WHERE子句.唯一适用于整个UNION的条款是ORDER BY.所以你的查询需要一些调整:
SELECT nombre FROM dbo.internados WHERE nombre = ? -- the added line UNION SELECT nombre FROM dbo.universidades WHERE nombre = ? ;
其次,如果你想要两个表都有相同的nombre(这不是很清楚,但我猜这是正确的),那么这将无法工作,因为如果在任一表中找到值,它只返回一个nombre.解决这个问题的最好方法可能就是加入:
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 ;
我并不是100%确定我完全理解你在寻找什么,所以如果我错过了标记,请大声说出来.
您可以这样考虑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 ;
通过这种方式,我们确保有两个值.请注意,这假设每个表中不能有两个相同的名称.如果这是真的,那么需要做更多工作才能使UNION方法完成工作.