使用php/mysql-union查询创建数据网格?
我正试图从多个表中创建可用性网格,以提供以下信息:使用php/mysql-union查询创建数据网格?,php,mysql,union,Php,Mysql,Union,我正试图从多个表中创建可用性网格,以提供以下信息: ------------------------------------------------------ venue | 22/11 | 23/11 | 24/11 | 25/11 | 26/11 | ------------------------------------------------------ Some venue | £24 | £25 | £32 | N/A | £65 | ----
------------------------------------------------------
venue | 22/11 | 23/11 | 24/11 | 25/11 | 26/11 |
------------------------------------------------------
Some venue | £24 | £25 | £32 | N/A | £65 |
------------------------------------------------------
Some venue | £20 | N/A | £22 | £34 | £43 |
-------------------------------------------------------
对于每个场馆,我可以使用以下查询为所选日期段创建一个记录集:
SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 7
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate;
这里的关键是,我可以为任何不可用的日期返回空值,同时将我的记录集保留为正确的天数(即一个工作周5个条目)
要将其他每个场馆添加到此列表中,我只考虑使用联合查询将数据集合并为一个,如下所示:
(SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 7
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate)
UNION
(SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 8
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate);
我担心的是,如果有10个不同的场馆可以查询,那么查询可能需要相当长的时间
因此,我的问题如下:工会查询是我唯一的选择,还是我可以使用其他加入方式来确保我获得所有被查询场馆的完整周结果
希望这是清楚的:-S
编辑:
下面是所需记录集和当前查询的屏幕截图,以说明我的目的:
按建议使用IN():
为什么不在()中使用
是的,毫无疑问,正如Webnet所描述的,您可以在声明中使用它来选择您的venueID 还要注意,
groupby
在这里不是处理重复项的正确方法:事实上,除了MySQL
,在任何其他系统中,甚至在启用了ANSI
groupby
行为的MySQL
中,您的查询都会发出哀号
在
可用性中是否可能存在(日期,id)
上的重复项?如果是,应该选择这些重复项中的哪一项?Hi,在这条路上,使用IN()只会返回5行,而我希望在“一周”内返回10行对于每个地点。我已经修改了原来的问题,以更详细地说明我的意思。作为对@webnet答案的评论,在temp_date中,每个条目只有一个条目,这并没有给出期望的结果。我需要为每个地点/日期组合输入地点/日期。i、 e一个场馆/周有5个参赛项目,两个场馆/周有10个参赛项目。我已经修改了原来的问题,以更详细地说明我的意思。谢谢你,我很快就会有一个剧本。不,(日期,id)重复项在可用性上是不可能的。@simnom:您可以通过
删除分组,这样就多余了。您还应该有一个场地表,这样交叉连接就更简单了。
SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId IN(7, 8)
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate
SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId IN(7, 8)
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate
SELECT td.query_date, a.venueId
FROM temp_date td
CROSS JOIN
(
SELECT 7 AS id
UNION ALL
SELECT 8 AS id
) ids
LEFT JOIN
availability a
ON a.date = td.query_date
AND a.id = ids.id
ORDER BY
ids.id, td.query_date