我有两个表,它们的结构非常相似。
Universidades nombre | contenido | becas | fotos etc etc etc Internados nombre | todo | becas | fotos etc etc etc
我想编写一条SQL语句,nombre从它们两个中选择,并仅在匹配时将其作为数组返回。从我所看到的UNIONSELECT似乎是做到这一点的方法。我最后补充说WHERE,这就是问题所在。到目前为止,我收到的是第一张表的第一行。
nombre
UNIONSELECT
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));
抱歉,我想从这两个表中检索一个结果。 在Nameesnombre列都是独立的两个表中的不同
在解决问题之前要指出的一个问题是,每个查询中的查询UNION都是不同的,并且需要自己的WHERE子句。整体上唯一适用于的子句UNION是ORDERBY。因此,您的查询需要进行一些调整:
UNION
ORDERBY
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
NULL
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方法完成工作。