MySQL将查询合并为一个

时间:2011-12-20 21:18:27

标签: php mysql subquery

让我解释一下我想做什么。首先,这是我到目前为止的结果预览:

enter image description here

我的查询:

SELECT slides.name as slide, filename, time, sort_id 
FROM `slide_sort` 
INNER JOIN slides 
    ON slide_sort.slide_id = slides.id 
WHERE slide_sort.user_id = 1

因此,每张幻灯片都是已创建的页面,但每位用户都可以指定在该页面上停留多长时间以及下一张“幻灯片”的内容。

所以HTML看起来像这样:(dashboard.php)

<meta http-equiv="refresh" content="40;url=did-you-know.php">

现在它是硬编码但我希望能够从数据库中提取它。


因此,在 dashboard.php 文件中,我可以在顶部添加一些内容,例如$currentSlide = "Dashboard";,这样我就可以添加到查询AND slide = $currentSlide中,这样我就可以看到幻灯片的时间是40秒,所以我可以将其粘贴到content="$time"。但我的问题是,我如何添加另一个查询来获取NEXT sort_id所以 sort_id + 1 并获取该文件名,因此我将获得以下信息:

幻灯片 - 时间 - next_filename

仪表板 - 40 - did-you-know.php


但是我还需要看看它是否是最后一个sort_id,如果是,那么下一张幻灯片需要从#1开始。

这有意义吗?

如果有人能帮助我朝着正确的方向前进,我会非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容检索NEXT排序ID:

SELECT slides.name as slide, filename, time, sort_id  
FROM `slide_sort` 
INNER JOIN slides 
ON slide_sort.slide_id = slides.id 
WHERE slide_sort.user_id = 1 and slide_sort.sort_id = ($sort_id + 1)

您可以使用以下内容检索最后的排序ID:

SELECT sort_id 
FROM `slide_sort` 
INNER JOIN slides 
ON slide_sort.slide_id = slides.id 
WHERE slide_sort.user_id = 1 order by sort_id desc limit 1

您可以检查这是否是最后一张幻灯片,如下所示:

if ($sort_id == $last_sort_id)

如果是,您可以检索FIRST排序ID记录:

SELECT slides.name as slide, filename, time, sort_id  
FROM `slide_sort` 
INNER JOIN slides 
ON slide_sort.slide_id = slides.id 
WHERE slide_sort.user_id = 1 order by sort_id ASC limit 1

答案 1 :(得分:0)

您可以将查询结果限制为仅2行,包括当前幻灯片。这样,您将获得幻灯片重定向到以及下一张幻灯片。当然,您仍然需要迭代或使用固定索引,因为您需要处理多行。你需要检查一下你是否真的得到了2行,看看是否还有下一张幻灯片可用。

那就是说,我建议用你当前的查询检索完整的幻灯片集并迭代它以找到你需要的东西。因为...

  1. 这是一个简单的查询,mysql喜欢简单的查询。派生表和子查询类似于减慢查询速度,您不希望这样。即使看起来像是过早优化。
  2. 数据集不太可能非常大,O(N)algos便宜
  3. 它的好处是能够在整个幻灯片组中显示导航