在 HTML/PHP 下拉列表中列出枚举字符串,其中包含来自 2 个 MSSQL 表的值

Posted

技术标签:

【中文标题】在 HTML/PHP 下拉列表中列出枚举字符串,其中包含来自 2 个 MSSQL 表的值【英文标题】:List Enum String in HTML/PHP Dropdown with values from 2 MSSQL tables 【发布时间】:2018-08-22 10:40:10 【问题描述】:

我想在我的下拉选择中列出一个字符串,例如:

姓名 |间隔号 |间隔

字符串中的这 3 个值需要从 2 个 MSSQL 表中填充。现在,我将深入解释表格以及我希望在下拉列表中作为字符串得到什么结果。

这是表 1:

+-------------+------+
| PK_Table1_ID| Name |
+-------------+------+
|     1       | Name1|
|     2       | Name2|
|     3       | Name3|
+-------------+------+

表 2:

+--------------+--------------+-----------------+-----------+
| PK_Table2_ID | FK_Table1_ID | IntervallNumber | Intervall |
+--------------+--------------+-----------------+-----------+
|      1       |      2       |        1        |    168    |
|      2       |      2       |        2        |    336    |
|      3       |      2       |        3        |    500    |
|      4       |      2       |        4        |    672    |
|      5       |      2       |        5        |    840    |
|      6       |      2       |        6        |    1000   |
|      7       |      3       |        1        |    168    |
|      8       |      3       |        2        |    500    |
|      9       |      3       |        3        |    1000   |
+--------------+--------------+-----------------+-----------+

我认为我需要多个 SQL SELECT 语句并将它们合并为一个字符串,以便为我的下拉列表填充它。

可能是这样的:

$sql = "SELECT Name FROM table1";
$sql2 = "SELECT IntervallNumber, Intervall 
    FROM table2 
    WHERE table1.PK_Table1_ID = table2.FK_Table1_ID";
$seperator = " | ";
$string = $sql . $seperator . $sql2;

输出字符串的详细信息应如下所示:

echo "<option>" . $string . "</option>";

首先选择选项:“Name2 | 6 | 168,336,500,672,840,100”

第二个选择选项:“Name3 | 3 | 168,500,100”

第三个值也需要是字符串。

最大的问题是如何正确声明 MSSQL 语句并将其组合到枚举中,仅在 selction 中,而不是在 SQL 列中,因为列是整数,不能将 nvarchar, 一起使用。

有什么建议可以解决这个问题吗?

【问题讨论】:

您的 SQL Server 版本是多少? 根据经验,总是有一条 SQL 语句来代替合并两个SELECTs。 SQL 查询非常强大。 【参考方案1】:

您需要的 SQL 如下所示:

SELECT CONCAT(Name, ' | ', MAX(IntervallNumber), ' | ', GROUP_CONCAT(Intervall))
FROM table1 t1
JOIN table2 t2 ON t1.PK_Table1_ID = t2.FK_Table1_ID
GROUP BY t1.PK_Table1_ID

编辑:上面是mysql,但应该改用how-to-make-a-query-with-group-concat-in-sql-server 之类的东西

【讨论】:

我尝试了链接中的代码,但出现错误:
SELECT rop.PK_Table1_ID, rop.Name, ropp.IntervallNumber, Intervall = STUFF(( SELECT ',' + ropp.Intervall FROM Table2 ropp WHERE rop.PK_Table1_ID = ropp.FK_Table1_ID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM Table1 rop JOIN table2 ropp ON rop .PK_Table1_ID = ropp.FK_Table1_ID ORDER BY rop.name
这就是为什么我说“看起来像这样”然后链接到替换 GROUP_CONCAT 的位置,很抱歉我目前无法调试 sql server 好的,我看到了这个问题,灵魂对我没有用,因为如果列是 nvarchar 但最后一列 Intervall 是 int,那么它只考虑基于 sql 的输出结果,所以我不能枚举它在她里面。所以我需要一个组合在 php 中的独奏字符串【参考方案2】:

更改此查询

    $sql = "SELECT Name FROM table1";
  $sql2 = "SELECT IntervallNumber, Intervall 
  FROM table2 
 WHERE table1.PK_Table1_ID = table2.FK_Table1_ID";

 $sql = "SELECT a.Name,b.IntervallNumber from table b LEFT JOIN table a on 
 a.PK_Table1_ID = b.FK_Table1_ID WHERE a.PK_Table1_ID = b.FK_Table1_ID";

通过这个你可以在下拉列表中获取名称和间隔号

【讨论】:

好的,我如何在下拉列表中的 NAME 和 IntervallNumber 旁边获得具有相同 FK_Table1_ID 枚举的所有值的列“intervall”? $sql = "SELECT a.Name + "|" + b.IntervallNumber+"|" b.Intervall from table b LEFT JOIN table a on a.PK_Table1_ID = b.FK_Table1_ID WHERE a.PK_Table1_ID = b.FK_Table1_ID";【参考方案3】:

你可以试试这个:

T-SQL 语句:

SELECT 
    A.name, 
    IntervallNumber = MAX(IntervallNumber),
    Intervall = STUFF((
        SELECT ', ' + CONVERT(VARCHAR(MAX), X.Intervall)
        FROM Table2 X
        WHERE B.FK_Table1_ID = X.FK_Table1_ID
        FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM Table1 A
JOIN Table2 B ON A.PK_Table1_ID = B.FK_Table1_ID
GROUP BY B.FK_Table1_ID, A.name

输出:

Name2 6 168, 336, 500, 672, 840, 1000
Name3 3 168, 500, 1000

注意事项:

使用 SQL Server 2012 测试。

【讨论】:

完美,这就是我想要的。谢谢你,先生。

以上是关于在 HTML/PHP 下拉列表中列出枚举字符串,其中包含来自 2 个 MSSQL 表的值的主要内容,如果未能解决你的问题,请参考以下文章

将枚举转换为核心 2.1 剃须刀页面中的下拉列表

Thymeleaf下拉菜单

LabVIEW中下拉列表和枚举的区别(两点)

如何在下拉列表中显示枚举文本值?

Razor 中枚举下拉列表的显示名称

如何使用 Spring 和 Thymeleaf 在下拉列表中显示所有可能的枚举值?