【发布时间】:2020-07-16 19:59:58
【问题描述】:
我想从具有一个或多个连接的表中选择所有列,但我希望能够区分这些列属于哪个表(在列名前加上表名)。我不知道每个表中有哪些列,因此无法手动列出它们。
users:
--------------------------------
| id | name | age | contact_id |
--------------------------------
| 18 | Foo | 21 | 1 |
| 19 | Bar | 32 | 2 |
contacts:
----------------------------
| id | address | phone |
----------------------------
| 1 | 123 Main | 867-5309 |
| 2 | 987 Wall | 555-5555 |
我想要一些东西:
SELECT * FROM users
JOIN contacts on users.contact_id = contacts.id
WHERE users.id = 18
并得到如下结果:
---------------------------------------------------------------------
| users.id | users.name | ... | contacts.id | contacts.address | ...
---------------------------------------------------------------------
| 18 | Foo | ... | 1 | 123 Main | ...
尝试
到目前为止,我发现这是获取每个表的列名:
SELECT concat('contacts.', `COLUMN_NAME`) AS 'contacts'
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='myDb'
AND `TABLE_NAME`='contacts'
但我不知道如何将其放回我的选择中,或者这是否是正确的选择。
成功:我对@Bernd Buffen 回答的实现:
我正在使用 PHP 的 PDO 类来获取我的结果,所以我是这样做的。 (我将忽略此示例的 contacts 表,因为它很容易推断。)
$pdo = new PDO(...);
$stmt = $pdo->prepare(<<< EOT
SELECT group_concat(" ", COLUMN_NAME, " AS 'users.", COLUMN_NAME, "'") as 'columns'
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='myDb'
AND `TABLE_NAME`='users'
EOT);
$stmt->execute();
$columns = $stmt->fetch()['columns'];
$stmt2 = $pdo->prepare("SELECT $columns FROM users WHERE id = 18 LIMIT 1");
$stmt2->execute();
$result = $stmt2->fetch();
【问题讨论】:
-
您需要在存储过程中使用动态 SQL 来执行此操作。
-
查看stackoverflow.com/questions/15507683/… 了解基本示例。
-
@Barmar 诚然我还没有掌握存储过程,但这个例子似乎并没有转化为我想要做的事情。
-
我没有说它显示了如何做你想做的事情。它展示了使用 INFORMATION_SCHEMA 动态创建查询然后执行该查询的一般原则。
-
我希望您能从中推断出您的具体用例。