在 MariaDB 中的列名中创建超过 5 个别名时出现错误

问题描述 投票:0回答:1

我试图从不同的表中获取所有“标题”列。理想情况下,我希望从同一结果中的不同表中获取所有“标题”值,这样我就可以用 PHP 将它们一一写下来。

我的桌子是这样的:

CREATE TABLE `TaxoGenre` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Titre` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
  `Tri` int(11) NOT NULL,
  UNIQUE KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 

我的sql看起来像这样:

$sql = "
SELECT TD.Titre, TSD.Titre, TC.Titre, TOR.Titre, TSO.Titre, TF.Titre, TG.Titre
FROM TaxoDivision TD, TaxoSousDivision TSD, TaxoClasse TC, TaxoOrdre TOR,
TaxoSousOrdre TSO, TaxoFamille TF, TaxoGenre TG";

$stmt = $dbPDO->prepare($sql);
$stmt->execute();
$groups = $stmt->setFetchMode(PDO::FETCH_ASSOC);
$groups = $stmt->fetchAll();

$stmt->closeCursor();

var_dump($groups);

在我的 php 页面上执行时,请求返回 503 服务不可用错误。没有我可以调试的 php 错误。

当我直接在 phpMyAdmin 中的 MariaDB 服务器上执行此操作时,我得到了结果,但在 7 个不同的列中具有相同的“Titre”名称,这不是我想要的。我希望所有结果都相互附加。

我认为错误可能来自具有相同名称的列名称,所以我尝试了:

SELECT TD.Titre AS Division, TSD.Titre AS SousDivision,
TC.Titre AS Classe, TOR.Titre AS Ordre, TSO.Titre SousOrdre,
TF.Titre AS Famille, TG.Titre AS Genre 
FROM TaxoDivision TD, TaxoSousDivision TSD, TaxoClasse TC, TaxoOrdre
TOR, TaxoSousOrdre TSO, TaxoFamille TF, TaxoGenre TG

这甚至使我的直接 SQL 请求变坏.. #2006 - MySQL 服务器已经消失了

但是一旦我将别名限制为 5 个(无论顺序如何),它就可以在我的直接 SQL 测试中工作,剩下的两列仅命名为 Titre。例如:

SELECT TD.Titre, TSD.Titre,
TC.Titre AS Classe, TOR.Titre AS Ordre, TSO.Titre SousOrdre,
TF.Titre AS Famille, TG.Titre AS Genre 
FROM TaxoDivision TD, TaxoSousDivision TSD, TaxoClasse TC, TaxoOrdre
TOR, TaxoSousOrdre TSO, TaxoFamille TF, TaxoGenre TG

我们可以为列指定的自定义名称数量有限制吗??????

我知道我可以一次获取一个表并将结果添加到 php 中的数组中,但我真的很好奇该错误的原因以及我们如何在简单的 SQL 中将不同表的结果合并到一个数组中结果...一如既往地感谢您的专业知识!!

使用 PHP 8.2,数据库为 10.6.16-MariaDB-cll-lve-log

编辑:我确认此代码有效。但是MySQL有没有简单的方法呢?

$names = [];
$tables = [];
$tables[] = "Division";
$tables[] = "SousDivision";
$tables[] = "Classe";
$tables[] = "Ordre";
$tables[] = "SousOrdre";
$tables[] = "Famille";
$tables[] = "Genre";


foreach ($tables as $tbName) {
    $sql = "SELECT Taxo$tbName.Titre FROM Taxo$tbName";
    $stmt = $dbPDO->prepare($sql);
    $stmt->execute();
    $groups = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $groups = $stmt->fetchAll();
    $names = array_merge($names,$groups);
    $stmt->closeCursor();
}


var_dump($names);

编辑2

为了恢复我的主要目标,想象 2 张桌子:

表 1:分类部门

ID    Title

1     Eucomycota
2     Agaricomycota

表 2:TaxoSousDivision

ID    Title

1     Agaricomycetes
2     Eucomycetes

七张桌子依此类推

我怎样才能得到

Title

Eucomycota
Agaricomycota
Agaricomycetes
Eucomycetes
…

我不需要ID,ID仅在每个表中是唯一的,但表之间没有关系

php mysql join mariadb
1个回答
0
投票

好的,感谢@Barmar,UNION 就是我一直在寻找的..这有效。

SELECT TaxoDivision.Titre FROM TaxoDivision
UNION SELECT TaxoSousDivision.Titre FROM TaxoSousDivision
UNION SELECT TaxoClasse.Titre FROM TaxoClasse
UNION SELECT TaxoOrdre.Titre FROM TaxoOrdre
UNION SELECT TaxoSousOrdre.Titre FROM TaxoSousOrdre
UNION SELECT TaxoFamille.Titre FROM TaxoFamille
UNION SELECT TaxoGenre.Titre FROM TaxoGenre;

我使用了很多 JOIN 但第一次需要 UNION!

谢谢

但我仍然对 5 别名感到好奇..但我可能只是因为笛卡尔错误而对服务器要求太多

© www.soinside.com 2019 - 2024. All rights reserved.