一尘不染

仅从多个表中选择同一列

sql

我有两个表,它们的结构非常相似。

Universidades
nombre | contenido | becas | fotos etc etc etc
Internados
nombre | todo | becas | fotos etc etc etc

我想编写一条SQL语句,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列都是独立的两个表中的不同


阅读 268

收藏
2021-03-17

共1个答案

一尘不染

在解决问题之前要指出的一个问题是,每个查询中的查询UNION都是不同的,并且需要自己的WHERE子句。整体上唯一适用于的子句UNIONORDERBY。因此,您的查询需要进行一些调整:

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),则可以得到笛卡尔乘积,该乘积是一个输入中的每一行与另一输入中的每一行匹配。
    • 当使用OUTERjoin– LEFT,-时RIGHTFULL如果内部输入(或其中一个输入FULL)与其他输入不匹配,则NULLs将被放置在其他输入的列中。
  • 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方法完成工作。

2021-03-17