我有两个问题:
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
)
)
)
)
第一个查询返回事件,第二个查询返回连接。如果可能的话,我想只用一个查询返回所有内容。
答案 0 :(得分:0)
纯SQL的一个问题是您无法在单个查询中创建嵌套结果。您只能返回包含所有字段的平面记录。然后,您将使用应用程序层将记录解析为嵌套行。
如果你正在使用像linq或Hibernate这样的ORM,那么所有工作都会进入后台。
您可以获得如下结果:
events.id | events.title | events.locale | users.id | users.first_name | users.last_name
,在您的情况下,将返回10个不同的记录,其中来自事件的字段将在每个记录中重复。然后,您的应用程序服务器会将其解析为嵌套数组。
我已经两种方式编写查询,我得到一个平面记录,我描述它的方式,并在应用程序服务器上解析它,我在哪里对事件进行初始查询,并单独查询每个事件,再次来自应用程序服务器。它们都有效,这只是一个问题,在你的情况下,获取事件,然后是用户,或获取所有数据然后解析它是否更简单/更快。