繁体   English   中英

从表中的同一个键引用多列外键

[英]Multiple column foreign key referencing on the same key from a table

我有这个:

Table "schedules"
----------------------------------------------------------------------
| sched_id | sched_name | sc_id1 | sc_id2 | sc_id3 | sc_id4 | sc_id5 |
----------------------------------------------------------------------
|    1     |  block 1   |   1    |    2   |   3    |    4   |    5   |
----------------------------------------------------------------------
|    2     |  block 2   |   1    |    2   |   3    |  NULL  |  NULL  |
---------------------------------------------------------------------- 

Table "subject_current"
---------------------------------------
|sc_id | sl_id | schoolyear | semister|
---------------------------------------
|   1  |   5   | 2014-2015  |    1st  |
---------------------------------------
|   2  |   6   | 2014-2015  |    1st  |
---------------------------------------
|   3 |    7   | 2014-2015  |    1st  |
---------------------------------------
|   4  |   8   | 2014-2015  |    1st  |
---------------------------------------
|   5  |   9   | 2014-2015  |    1st  |
---------------------------------------

Table "subject_list"
-------------------------------------------------------------
|sl_id | subject_code | subject_description | subject_prereq|
-------------------------------------------------------------
|   5  |      math1   |         algebra     |      none     |
-------------------------------------------------------------
|   6  |      math2   |    trigonometry     |      none     |
-------------------------------------------------------------
|   7  |      math3   |        Calculus     |      none     |
-------------------------------------------------------------
|   8  |      eng1    |       english 1     |      none     |
-------------------------------------------------------------
|   9  |      hum1    |      humanities     |      none     |
-------------------------------------------------------------

sc_id1-sc_id5是引用相同键的外键,它是表subject_current中的 sc_id 而从表subject_currentsl_id被引用从表subject_listsl_id。

我的问题是,如何仅使用table 计划中的数据从table subject_list中检索数据? 我想要实现的是这样的:

(This will echo on my page)
--------------------------------------------------------------------------------
| sched_id | sched_name |                       Subjects                       | 
--------------------------------------------------------------------------------
|    1     |   block 1  | algebra, tirgonometry, calculus, english1, humanities|
--------------------------------------------------------------------------------
|    2     |   block 2  |          algebra, tirgonometry, calculus             |
--------------------------------------------------------------------------------

我搜索了LEFT JOIN但这对我来说有点困难,因为我只是这个领域的初学者,而且有三个tables可能需要JOIN 所以,如果你能提出一些建议,我很高兴地欣赏这一点。

EDITED

我发现了这个,我差不多了,但它只显示表schedule_subject_currents中的第一个sc_id

    <?php

    echo "<table class='opensubtbl' cellspacing='0' cellpadding='5' ><tr>";

    echo "<th>Schedule ID</th>";
    echo "<th>Sched Name</th>";
    echo "<th>Subjects ID</th></tr>";

    //$sched = mysql_query("select * from schedules s, schedule_subject_currents h, subject_current c, subject_list l where s.sched_id = h.sched_id and h.sc_id = c.sc_id and c.sl_id = l.sl_id");
    //$sched = mysql_query("SELECT * FROM schedules");

    $sched = mysql_query("

        SELECT *
        FROM schedules s
        LEFT JOIN schedule_subject_currents ssc ON ssc.sched_id = s.sched_id
        LEFT JOIN subject_current c ON c.sc_id = ssc.sc_id
        LEFT JOIN subject_list l ON l.sl_id = c.sl_id
        GROUP BY s.sched_id, sched_name
        ORDER BY sched_name

    ");

    while($rows_s = mysql_fetch_assoc($sched)){
        $s_schedid = $rows_s['sched_id'];
        $s_schedname = $rows_s['sched_name'];
        $s_subdesc = $rows_s['subject_description'];
        $s_scid = $rows_s['sc_id'];

        echo "<tr>";
        echo "<td>$s_schedid</td>";
        echo "<td>$s_schedname</td>";

        echo "<td>$s_subdesc</td>";
        echo "</tr>";
    }

    echo "</table>";

?>

避免将相同类型的信息存储在不同的列中,否则最终会遇到类似于您遇到的问题。 相反,您应该将每条信息存储在自己的行中。

首先,通过引入称为例如 scedule_subject_currents另一个表正常化您的数据架构,使你有

Table "schedules"
-------------------------
| sched_id | sched_name |
-------------------------
|    1     |  block 1   | 
-------------------------
|    2     |  block 2   | 
-------------------------

Table "schedule_subject_currents"
--------------------
| sched_id | sc_id |
--------------------
|    1     |  1    |
--------------------
|    1     |  2    |
--------------------
|    1     |  3    |
--------------------
|    1     |  4    |
--------------------
|    1     |  5    |
--------------------
|    2     |  1    |
--------------------
|    2     |  2    |
--------------------
|    2     |  3    |
--------------------

然后您可以使用查询

SELECT s.sched_id, s.sched_name, GROUP_CONCAT(subject_description) as Subjects
FROM schedules s
LEFT JOIN schedule_subject_currents ssc ON ssc.sched_id = s.sched_id
LEFT JOIN subject_current c ON c.sc_id = ssc.sc_id
LEFT JOIN subject_list l ON l.sl_id = c.sl_id
GROUP BY s.sched_id, sched_name
ORDER BY sched_name

尝试while嵌套查询:

<?php

    echo "<table class='opensubtbl' cellspacing='0' cellpadding='5' ><tr>";

    echo "<th>Schedule ID</th>";
    echo "<th>Sched Name</th>";
    echo "<th>Subjects</th>";
    echo "<th></th></tr>";

    //$sched = mysql_query("select * from schedules s, schedule_subject_currents h, subject_current c, subject_list l where s.sched_id = h.sched_id and h.sc_id = c.sc_id and c.sl_id = l.sl_id");
    //$sched = mysql_query("SELECT * FROM schedules");
    //$sched = mysql_query("SELECT * FROM schedules s LEFT JOIN schedule_subject_currents ssc ON ssc.sched_id = s.sched_id LEFT JOIN subject_current c ON c.sc_id = ssc.sc_id LEFT JOIN subject_list l ON l.sl_id = c.sl_id ORDER BY sched_name ");

    $sched = mysql_query("SELECT * FROM schedules");

    while($rows_s = mysql_fetch_assoc($sched)){
        $s_schedid = $rows_s['sched_id'];
        $s_schedname = $rows_s['sched_name'];

        echo "<tr>";
        echo "<td>$s_schedid</td>";
        echo "<td>$s_schedname</td>";
        echo "<td>";

        $schedsubcur = mysql_query("SELECT * FROM schedule_subject_currents WHERE sched_id='$s_schedid'");
        while($rows_ssc = mysql_fetch_assoc($schedsubcur)){
            $ssc_scid = $rows_ssc['sc_id'];
            $schedsublist = mysql_query("SELECT * FROM subject_current WHERE sc_id='$ssc_scid'");
            while($rows_ssl = mysql_fetch_assoc($schedsublist)){
                $ssl_slid = $rows_ssl['sl_id'];
                $ssublist = mysql_query("SELECT * FROM subject_list WHERE sl_id='$ssl_slid'");
                while($rows_ssubl = mysql_fetch_assoc($ssublist)){
                    $ssubl_subdesc = $rows_ssubl['subject_description'];
                    echo $ssubl_subdesc."($ssc_scid), ";
                }
            }
        }

        echo "</td>";
        echo "</tr>";
    }

    echo "</table>";

?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM