【问题标题】:Classic ASP - Can I lose my nested loop in exchange for a join?经典 ASP - 我可以失去我的嵌套循环以换取加入吗?
【发布时间】:2012-04-10 08:32:02
【问题描述】:

我正在尝试优化其中一个脚本。它用于库存照片网站,并使用 WHILE WEND 循环显示大量图像网格,循环遍历我的 DB (MySQL) 照片表。

在这个循环中,我有另一个 WHILE END 循环,它从我的人物表中获取每张照片中人物的姓名。

我的问题是,我可以通过向主查询添加 JOIN 来丢失第二个 WHILE WEND 循环吗?

我的困惑来自于返回多个人。我不知道如何用逗号分隔一个或多个名称,我只是不知道。也许我的脚本本来就很好,但我确信没有嵌套循环会更快,因为在某些时候,我正在考虑添加另一个查询,它返回每张照片的前 5 个关键字,并且不要不想再添加一个循环!

屏幕截图

我的伪代码

Set rsPhotos = Conn.Execute(" " _
& "SELECT photoID, setID, caption, dateCreated, dateUploaded " _
& "FROM photos ORDER BY dateCreated DESC;)"

While NOT rsPhotos.EOF
    Response.Write "<div>"
        Response.Write "<img src=""photo.jpg"">"
        Response.Write "<p>"
            people_str = ""
            Set rsPeople = Conn.Execute("SELECT p.person FROM photoPeople AS pp " _
            & "LEFT JOIN people AS p USING (personID) " _
            & "WHERE pp.photoID = "&rsPhotos.Fields("photoID")&" " _
            & "ORDER BY p.person ASC;")
            While NOT rsPeople.EOF
                people_str = people_str & ", " & rsPeople.Fields("person")
            rsPeople.MoveNext
            Wend
            rsPeople.Close
            Response.Write Mid(people_str,3)
        Response.Write "</p>"
    Response.Write "<div>"
rsPhotos.MoveNext
Wend

rsPhotos.Close

数据库架构

PHOTOS tbl
photoID        |   INT 9
setID          |   INT 9
caption        |   VARCHAR2000
dateCreated    |   DATETIME
dateUploaded   |   DATETIME

PHOTOPEOPLE tbl
photoID        |   INT 9
personID       |   INT 7

PEOPLE tbl
personID       |   INT 7
person         |   VARCHAR 100

【问题讨论】:

    标签: mysql sql asp-classic


    【解决方案1】:

    应该这样做 -

    SELECT photos.photoID, photos.setID, photos.caption, photos.dateCreated, photos.dateUploaded, GROUP_CONCAT(p.person ORDER BY p.person ASC SEPARATOR ', ')
    FROM photos
    LEFT JOIN photoPeople AS pp
        ON photos.photoID = pp.photoID
    LEFT JOIN people AS p
        ON pp.personID = p.personID
    GROUP BY photos.photoID
    ORDER BY dateCreated DESC
    

    GROUP_CONCAT()

    【讨论】:

    • 哇,非常感谢!它的工作原理和性能比我以前的方法好得多。很高兴你向我介绍了 GROUP_CONCAT,我有很多地方可以做这个。另外,感谢您关注我的 ORDER BY 人员条件并在 concat 函数分隔符中添加空格和逗号 (, )。很好的答案!
    • 这是一个非常有用的函数,但是您需要注意GROUP_CONCAT返回的字符串的长度受group_concat_max_len系统变量的限制。
    • 我刚刚检查过:在我的情况下,默认值应该足够 (1024),因为一张照片中最多的人数是 4。我使用共享主机,所以这个变量可以'不会被修改,所以我会在我的其他项目中记住这一点。谢谢。
    • 你应该能够为当前会话设置它,即使是在共享主机上,使用SET @@session.group_concat_max_len=2048
    • 我发誓我刚刚在某人的博客上读到我做不到,但 MySQL 文档说我可以。我是否将其作为主查询上方的单独查询运行: Conn.Execute("SET @@session......") ?
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多