【问题标题】:SQL Select query returning unwanted dataSQL Select 查询返回不需要的数据
【发布时间】:2013-01-11 03:20:11
【问题描述】:

我有一个表,其中填充了从数据库中选择学生编号的查询中的数据。视图是这样的:

如您所见,同一条数据被多次输出。我有一个功能,无论出于何种原因,辅导员都无法完成学生,然后他们可以将学生发送给另一位辅导员。现在为了维护历史数据,我保留了所有这些数据。现在,当我回到我的学生队列时,它会显示所有当前数据(我想要的)和所有过去的历史数据(我不想要的)

这是我的 sql 语句:

    try 
                {
            $query = $dbh->prepare("SELECT 
        session.session_id AS id, 
        session.anum, 
        student.first, 
        student.last, 
        session.why, 
        session.studentcomments, 
        session.aidyear,
        support.counselorcomments 
        FROM 
        student INNER JOIN session ON student.anum = session.anum 
        INNER JOIN session_status ON session.status = session_status.status 
        LEFT JOIN support ON session.session_id = support.session_id
        WHERE session.status = 0 OR session.status = 2");

    $query->execute();
            $result = $query->fetchall();
                }
                    catch (PDOException $e) {
                    error_log($e->getMessage());
                    die($e->getMessage());
}

现在我设置数据库的方式是我希望它保持正常工作的方式。我只是认为我查询数据的方式是问题所在。

这是mysql中数据的图片:

编辑

现在由于该问题已得到解决,因此我遇到了一个错误,即每当发生插入(更新 support.starttime 时间戳)时,上述记录就会消失,这是我更新的 sql

$query = $dbh->prepare("SELECT session.session_id AS id, session.anum, student.first, student.last, session.why, 
                        session.studentcomments, session.aidyear, support.counselorcomments FROM student LEFT JOIN 
                        session ON student.anum = session.anum LEFT JOIN session_status ON 
                        session.status = session_status.status LEFT JOIN support ON session.session_id = support.session_id
                        WHERE (session.status) IN (0) OR (session.status) IN (2) 
                        AND support.starttime = (SELECT MAX(support.starttime) FROM support INNER JOIN session ON session.session_id = 
                        support.session_id)");

【问题讨论】:

  • 你有一对多的关系,所以 join 会获取多个结果,因此你的记录会被重复
  • 有没有办法解决这个问题,以便我可以在支持表中显示最新记录的特定视图?
  • 好吧,我不知道你在做什么,但看看 mysql 的 GROUP_CONCAT 这可能会有所帮助

标签: php mysql select pdo


【解决方案1】:

如果我正确阅读了您的问题,您只需要 Session 表中的最新行,对吗?

如果是这样,您将需要在 Where 子句中实现子选择以获取 MAX(session.starttime)。

如果是这种情况,您可以使用以下语法:

WHERE ...(what you already have)...
  AND session.startime = (SELECT MAX({YourTable}.starttime)
                            FROM {YourTable}
                           WHERE {YourTable}.anum = session.anum)

如果我有所有涉及的表的详细信息,我会为您编写整个查询。这能回答你的问题吗?

更新答案:

您必须告诉子查询您想要哪个 session_id 的开始时间,您可以通过将子查询表与主查询结果集连接来做到这一点。

您的子查询应该是:

(SELECT MAX(a.starttime) FROM 支持一个 WHERE a.session_id = session.session_id)

【讨论】:

  • 你先生真棒!!!我添加的只是: AND support.starttime = (SELECT MAX(support.starttime) FROM support) 并且做到了,甚至不需要在哪里。我会更新 OP。
  • 由于某种原因也执行 ORDER BY 并没有对所有行进行排序。它选择了要选择的特定行。哇,我真的需要对子查询有深入的了解。总而言之,子查询可用于更具体地选择您想要的数据,对吗?
  • 谢谢,子查询是为了限制返回的数据,是的——但是,你需要把你的子查询绑定回原来的查询&学生证;否则,您将返回 any 学生(笛卡尔积)的最新行! :)
  • 我还在努力,会得到认可的,让我一起努力吧。
  • 在您的子查询中,对于也在您的主查询中的表,请确保您正在使用任何 WHERE-CLAUSE 语句和来自主查询的 JOINS。您必须确保您的主要查询条件正在您的子查询中用于两个查询中的表。例如,在您的主查询中,您使用 session.status in (0,2),但您没有在子查询中使用它。
【解决方案2】:
SELECT DISTINCT 
    session.session_id as id,
    session.anum,
    student.first,
    student.last,
    session.why,
    session.studentcomments,
    session.aidyear,
    support.counselorcomments
FROM student
        INNER JOIN session 
            ON student.anum = session.anum
        LEFT JOIN support 
            ON session.session_id = support.session_id
        WHERE session.status IN (0,2)

按照 ALberto 告诉我的方式使用 DISTINCT!谢谢阿尔贝托

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2018-07-12
    • 2012-04-19
    相关资源
    最近更新 更多