0

我有这两个查询:

SELECT `a`.*, `b`.`id` AS host_id, SUM(CASE WHEN c.event_id IS NOT NULL THEN 1 ELSE 0 END) AS count_joins, SUM(CASE WHEN c.event_id IS NOT NULL AND c.user_id = 0 THEN 1 ELSE 0 END) AS joined
FROM (`events` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id`
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id`
WHERE `a`.`date` > '2012-07-12 11:51:34'
GROUP BY `a`.`id`
ORDER BY `a`.`date` ASC
LIMIT 20

SELECT `b`.`id`, `b`.`first_name`, `b`.`last_name`, `b`.`email`, `b`.`username`, `b`.`thumbnail`
FROM (`joins` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`user_id`
WHERE `a`.`event_id` =  '1'
AND `a`.`user_id` != 0
ORDER BY  RAND()
LIMIT 8

第一个获取所有事件,然后,使用 foreach 循环,我使用第二个查询获取每个事件的连接。

我的问题是,我怎样才能用一个查询来完成所有这些工作?

这是我的架构:

图式

我想返回一个多维数组,例如:

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Title
            [description] => DescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescription
            [segment] => title
            [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg
            [cover] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg
            [locale] => Locale
            [address] => Rua Afonso Pena, 22, Tijuca
            [list] => 0
            [date] => 2013-10-10 10:10:10
            [created] => 
            [host_id] => 1
            [count_joins] => 5
            [joined] => 0
            [joins] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [first_name] => Giovanna
                            [last_name] => Carneiro
                            [email] => gigi@gmail.com
                            [username] => gigi
                            [thumbnail] => 1b6453892473a467d07372d45eb05abc2031647a.jpg
                        )

                    [1] => Array
                        (
                            [id] => 5
                            [first_name] => Júlio
                            [last_name] => César
                            [email] => jujuba@gmail.com
                            [username] => jujuba
                            [thumbnail] => ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4.jpg
                        )

                    [2] => Array
                        (
                            [id] => 3
                            [first_name] => Claudio
                            [last_name] => Cardozo
                            [email] => cazo66@gmail.com
                            [username] => cazo
                            [thumbnail] => 77de68daecd823babbb58edb1c8e14d7106e83bb.jpg
                        )

                    [3] => Array
                        (
                            [id] => 1
                            [first_name] => Claudius
                            [last_name] => Ibn
                            [email] => ibnclaudius@gmail.com
                            [username] => ibnclaudius
                            [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg
                        )

                    [4] => Array
                        (
                            [id] => 2
                            [first_name] => Elza
                            [last_name] => Virginia
                            [email] => elza.mosqueira@gmail.com
                            [username] => elzavirginia
                            [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpg
                        )

                )

        )

    [1] => Array
        (
            [id] => 2
            [title] => Another Title
            [description] => Description
            [segment] => another-title
            [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpeg
            [cover] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpeg
            [locale] => Locale
            [address] => Travessa Nestor Vitor, 117, Tijuca
            [list] => 0
            [date] => 2013-10-10 10:10:10
            [created] => 
            [host_id] => 3
            [count_joins] => 5
            [joined] => 0
            [joins] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [first_name] => Claudius
                            [last_name] => Ibn
                            [email] => ibnclaudius@gmail.com
                            [username] => ibnclaudius
                            [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg
                        )

                    [1] => Array
                        (
                            [id] => 4
                            [first_name] => Giovanna
                            [last_name] => Carneiro
                            [email] => gigi@gmail.com
                            [username] => gigi
                            [thumbnail] => 1b6453892473a467d07372d45eb05abc2031647a.jpg
                        )

                    [2] => Array
                        (
                            [id] => 3
                            [first_name] => Claudio
                            [last_name] => Cardozo
                            [email] => cazo66@gmail.com
                            [username] => cazo
                            [thumbnail] => 77de68daecd823babbb58edb1c8e14d7106e83bb.jpg
                        )

                    [3] => Array
                        (
                            [id] => 5
                            [first_name] => Júlio
                            [last_name] => César
                            [email] => jujuba@gmail.com
                            [username] => jujuba
                            [thumbnail] => ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4.jpg
                        )

                    [4] => Array
                        (
                            [id] => 2
                            [first_name] => Elza
                            [last_name] => Virginia
                            [email] => elza.mosqueira@gmail.com
                            [username] => elzavirginia
                            [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpg
                        )

                )

        )

)

第一个查询返回事件,第二个查询返回连接。如果可能的话,我想只用一个查询返回所有内容。

4

1 回答 1

0

纯 SQL 的问题之一是您无法在单个查询中创建嵌套结果。您只能返回包含所有字段的平面记录。然后,您将使用您的应用程序层将记录解析为嵌套行。

如果您使用的是 linq 或 Hibernate 之类的 ORM,所有工作都将在后台进行。

你可以得到如下结果:

事件.id| events.title| events.locale| 用户.id| users.first_name| users.last_name

在您的情况下,这将返回 10 条不同的记录,其中来自事件的字段将在每条记录中重复。然后,您的应用程序服务器会将其解析为嵌套数组。

我已经用两种方式编写了查询,我在哪里得到一个平面记录,我描述它的方式,并在应用程序服务器上解析它,我在哪里对事件进行初始查询,并为每个事件单独查询,再次从应用程序服务器。他们都工作,这只是一个问题,在你的情况下,获取事件,然后是他们的用户,或者获取所有数据然后解析它是否更简单/更快。

于 2012-07-12T16:03:41.010 回答