0

我有一个名为 mainevents 的表和一个名为 subevents 的表。对于每个主事件,我想要 3 个子事件,它们匹配 subname='$sub_name' 和 eventid。当有很多主要事件时,脚本太慢了。拖慢,10秒加载。当我禁用子事件循环时,脚本会立即加载。我认为可能有一种更短/更快/更简单的方式来编写以下内容。也许全部在一个查询中。我不完全确定。

$a=sqlsrv_query($conn, "SELECT
    eventid,status,name, CONVERT(varchar(100),date,107) AS dt 
    FROM dbo.mainevents WHERE 
    ( date >= '$start_date' AND date <= '$stop_date' ) AND disabled='0'
    ORDER BY category asc");
while($e=sqlsrv_fetch_array($a)){
    $b=sqlsrv_query($conn, "SELECT 
        subid, subname FROM dbo.subevents WHERE
        eventid='$e[eventid]' AND subname='$sub_name' ORDER BY subname");
    while($s=sqlsrv_fetch_array($b)){
        //do stuff
    }
}
4

1 回答 1

1

为什么不在第一个查询中连接两个表?

在没有子事件的情况下,尽管您需要进行外部连接,否则您将无法获得主要事件。

让 SQL 服务器的优化器决定什么需要循环。

SQL 将是这样的:

SELECT m.eventid, m.status, m.name, CONVERT(varchar(100),date,107) AS m.dt, s.subid, s.subname 
FROM dbo.mainevents m, dbo.subevents s
WHERE m.eventId *= s.eventId
AND ( m.date >= '$start_date' AND m.date <= '$stop_date' ) 
AND m.disabled='0'
ORDER BY m.category asc, s.subname asc

我认为这是 T-SQL 中外连接的正确语法,但我已经很久没有做过任何 T-SQL 工作了!:)

于 2013-03-16T10:35:52.253 回答