【问题标题】:JOIN / UNION SELECT all rows from two tables with different number of columnsMySQL JOIN / UNION SELECT 来自具有不同列数的两个表中的所有行
【发布时间】:2016-05-15 10:54:09
【问题描述】:

我正在尝试加入或合并两个不同结构表的结果,按它们的公共 pubdate 列对它们进行排序,但收到一条错误消息:

“使用的 SELECT 语句的列数不同”

$sql = "
SELECT * FROM news WHERE published='1' AND image!='' AND featured='1'
JOIN
SELECT * FROM videos WHERE published='1'
ORDER BY pubdate DESC
";
$query = mysqli_query($connection, $sql);
while($row = mysqli_fetch_array($query)){
$posttype = $row["posttype"];
$pubdate = $row["pubdate"];
if ($posttype == 'news'){
$content = $row["content"];
$image = $row["image"];
} // end if posttype
if ($posttype == 'videos'){
$description = $row["description"];
} // end if posttype
...
echo ....
} // end while

我如何编辑我的查询,以便我可以运行我的 fetch 数组并在之后检索相应的行(要获取的行然后决定于两个表共享的另一个公共行)?

【问题讨论】:

  • 你能给我们展示几行样本表数据和预期的结果吗?
  • 感谢大家到目前为止的帮助,我已经编辑了上面的代码以提供有关我想要检索的数据和输出的更多详细信息

标签: mysql sql join mysqli union


【解决方案1】:

由于您没有提供示例数据,我们无法建议您正确使用什么以及如何使用,但我注意到:

JOIN 的语法不正确。应该是这样的:

SELECT *
FROM tbl1 t1
INNER JOIN tbl2 t2 ON t1.Id = t2.Id

如果您想使用UNION - 两个表中的列顺序和列数应该匹配,因此您必须在两个表中提供列名,如下所示:

SELECT Col1, Col2, Coln
FROM tbl1

UNION

SELECT Col1, Col2, Coln
FROM tbl2

【讨论】:

  • OP 使用的表有不同的列数。因此,您在上面显示的 UNION ALL 仅在您从 SELECT 列表中删除一个或多个列的表中具有更多列时才有效。这意味着 UNION ALL 的结果将比两个原始表具有更少的信息。另一种方法是添加 NULL/literals/functions/whatever you want to the table with less columns.
  • 你在开玩笑@mauro 吗?我提供了语法,而不是解决方案! OP想要使用JOIN的可能性很大。如果我没有注意到将 NULL's 添加为列值,这并不意味着答案不正确或应该被否决。另外,您为什么要谈论UNION ALL,也许OP 想使用UNION 来避免重复?为什么您没有提供如何将WHERE 子句与UNION ALL 运算符一起使用的信息?我认为这是因为您不需要提供所有信息和教程,为什么以及如何使用运算符等......
【解决方案2】:

您可以通过在选择列表中添加缺少的列来UNION ALL 具有不同列数的表。我的意思是,假设你有:

SQL> create table one ( c1 integer , c2 integer, c3 integer ) ;
SQL> create table two ( c1 integer , c2 integer ) ;

以下UNION ALL 不起作用:

SQL> select * from one union all select * from two ;
[mysqld-5.5.27]The used SELECT statements have a different number of columns

不过这个没问题:

SQL> select * from one union all select *, null from two ;

请注意,我们确实为表 two 上缺失的 (c3) 列添加了 NULL。你可以添加任何你想要的......

【讨论】:

  • @StanislovasKalašnikovas 我倾向于同意,但这只是个人喜好问题。为了简洁起见,我这样做了。我认为 OP 得到了他正在寻找的答案......
  • 如果您对答案投了反对票,请留下评论原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多