我对更高级的MySQL查询内容不是很有经验..(主要是基本查询,返回和解析响应等等)
然而..当我需要来自数据库的多个事物(响应)时,我不清楚正确的方法..有没有办法从单个查询中获取这些东西?或者我每次都需要做一个新的查询?
背景: 我使用PDO来做一个SELECT语句
即:
$getAllVideos_sql = "SELECT * as FROM $tableName WHERE active IS NOT NULL OR active != 'no' ORDER BY topic, speaker_last, title;";
$getAllVideos_stmt = $conn->prepare($getAllVideos_sql);
$getAllVideos_stmt->execute();
$getAllVideos_stmt->setFetchMode(PDO::FETCH_ASSOC);
$results = $getAllVideos_stmt->fetch(PDO::FETCH_ASSOC);
//parse as I see fit
这给了我大量数据'我可以随意挑选并展示。
然而..我也希望能够提供一些统计数据(总计)
总共(不同)'主题'以及'标题'的总数。 (默认情况下都应该是唯一的)
我是否需要再做一次查询,准备,执行,setFetchMode,重新获取?
这是正确的方法吗?或者有没有办法阻止已经发挥作用的初始命令?
要明确的是,我并不是真的在寻找一个问题......我想要了解一个人这样做的正确方法......当他们像我一样需要几个数据时?多个查询和执行..等等?
或许它可以和 - 应该在一个片段中完成?通过调整查询本身来返回子选择/查询信息?
这不是正确的语法,因为它只返回1条记录..(但总主题数似乎是正确的,即使我只返回1条记录)
SELECT *,count(DISTINCT主题)为totalTopics,count(DISTINCT标题)为totalTitles FROM $ tableName;
也许这是更合适的方法?尝试在主查询中包含这些总数/详细信息以便选择?
希望这是有道理的。
由于
答案 0 :(得分:1)
我认为你不会得到任何非常干净的东西,但这样的事情可能有用:
SELECT * from $Table t
INNER JOIN (
SELECT COUNT(DISTINCT Topic) as TotalTopics FROM $Table
) s ON 1 = 1
INNER JOIN (
SELECT COUNT(DISTINCT Title) as TotalTitles FROM $Table
) f ON 1 = 1
WHERE ( Active IS NOT NULL ) AND Active != 'no'
答案 1 :(得分:0)
特别是对于Web应用程序,许多人在此过程中的某个地方经常进行计数或其他聚合。有时,如果它是全局上下文,例如所有用户的所有主题,那么拥有一些存储的聚合有助于而不是每次都重新查询所有记录计数。
实施例。如果您有一个包含“主题”列表的表,请在其中为uniqueTitleCount指定一列。然后,根据触发器,当新主题添加到主题时,通过添加1自动更新计数。您可以通过对所述“主题”表执行相关更新来预填充此列,然后一旦触发器是设置,您可以拥有该列。
这也有效,因为我多次看到人们想要“最近的”。如果您的系统在表中具有自动增加ID,类似地,具有为给定主题创建的最新ID,或者甚至是给定标题/文档/线程的最新ID,因此您不必继续执行类似的操作。 / p>
select documentID, other_stuff
from sometable
where documentID in ( select max( documentID )
from sometable
where the title = 'something' )
使用这些有意义的地方,然后优化下拉菜单变得更容易处理。你甚至可以为每个文档“标题”提供一个计数器,甚至是最近的发布日期,这样他们就可以根据兴趣,活动频率等来快速排序。