Javascript 在输出中使用AJAX/多个sql语句显示外键描述而不是值

Javascript 在输出中使用AJAX/多个sql语句显示外键描述而不是值,javascript,php,sql,ajax,mysqli,Javascript,Php,Sql,Ajax,Mysqli,一般来说,我使用3个不同的表(3个级别),每个表都使用外键引用上一个表。第二级表有一个外键,它引用上一级表,第三级表也引用第二级表。 我目前正在多选下拉列表中显示所有这些值。第三级multiselect下拉列表当前显示第二级multiselect下拉列表中的外键值。我要做的就是更改外键值以显示第二级表中的描述。 这是optgroup中外键值的当前外观: () 到目前为止,我总是通过创建另一个sql语句来实现这一点,该语句根据第二级表中的id选择描述。我不知道如何才能做到这一点,因为目前我有一个带

一般来说,我使用3个不同的表(3个级别),每个表都使用外键引用上一个表。第二级表有一个外键,它引用上一级表,第三级表也引用第二级表。 我目前正在多选下拉列表中显示所有这些值。第三级multiselect下拉列表当前显示第二级multiselect下拉列表中的外键值。我要做的就是更改外键值以显示第二级表中的描述。 这是optgroup中外键值的当前外观: ()

到目前为止,我总是通过创建另一个sql语句来实现这一点,该语句根据第二级表中的id选择描述。我不知道如何才能做到这一点,因为目前我有一个带有multiselect函数的javascript,它通过ajax访问php文件,ajax包含sql语句和输出。 为了提供更好的概述,我附上了重要的代码部分:

//Javascript
$('#idsecondlevel').multiselect({
        onChange:function(option, checked){
            //Store selected value in array format in selected variable
            var selected = this.$select.val();
            if(selected.length > 0){
                $.ajax({
                    url:"http://localhost:8080/fetch_xx.php",
                    method:"POST",
                    data:{selected:selected},
                    success:function(data){
                        $('#idthirdlevel').html(data);
                        $('#idthirdlevel').multiselect('rebuild');
                    }
                })
            }
        }  
    });

为了确保我的理解正确:第二级和第三级的内容是根据父表中的选定值动态显示的。所以基本上,你想让用户在第二级表格中选择一些/多个东西,然后让他在第三级表格中进入更多细节? 在屏幕截图中,您标记了1、2等。是否要显示父表中所选id的描述

如果是这样,为了避免另一个SELECT语句,可以使用联接。查看您的代码,您可能希望使用内部联接。要给出第三级选择的示例,请检查下面的伪代码。您可能希望以类似URL的方式显示分类历史记录(例如“abc/xyz”作为标题,下面有三级选项),因此您还需要一级描述。如果没有,只需删除相应的列即可。要与php集成,只需与所选选项的id进行比较

SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
    FROM first_level_table AS a
    INNER JOIN second_level_table AS b ON a.id = b.first_level_foreignkey
    INNER JOIN third_level_table AS c ON b.id = c.second_level_foreignkey;
我想到的另一件事是:1-3级的内容是相当静态的,所以为什么不使用视图呢?当然,这也有局限性,但由于您似乎只选择了值,所以这不应该困扰您。联接需要大量计算,如果计算过多,会降低计算速度。您可以使用准备好的视图来解决这个问题。因为我不知道您的数据库结构,伪代码可能看起来像这样:

CREATE VIEW view_allselectoptions AS 
    SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
        FROM first_level_table AS a, second_level_table AS b, third_level_table AS c
        WHERE a.id = b.foreign_key_firstlevel
            AND b.id = c.foreign_key_secondlevel;

您也可以在视图中使用连接。代码将与上面的代码类似。

非常感谢Lino!我按照您上面描述的方式创建了一个视图,并且必须添加内部连接才能正常工作。因此,具有两个级别的最终版本将是:创建视图视图所有选择选项,如选择a.id、a.description、b.id、b.foreign\u key\u firstlevel、b.description FROM first\u level\u table内部将第一个\u level\u表连接为a,将第二个\u level\u表连接为b ON a.id=b.foreign\u key\u firstlevel;
SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
    FROM first_level_table AS a
    INNER JOIN second_level_table AS b ON a.id = b.first_level_foreignkey
    INNER JOIN third_level_table AS c ON b.id = c.second_level_foreignkey;
CREATE VIEW view_allselectoptions AS 
    SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
        FROM first_level_table AS a, second_level_table AS b, third_level_table AS c
        WHERE a.id = b.foreign_key_firstlevel
            AND b.id = c.foreign_key_secondlevel;