我有2个数据表,分别是类别(category table)和视频(Video table),如下图所示。我正在查询这张图片(Query mysqli test)以获取视频及其目录。有没有办法我只能使用一个查询,但仍然获得与当前查询相同的结果?
<?php
include('config.php');
$page=intval($_REQUEST['page']);
$limit=10;
$start=$page*$limit - $limit;
$video=mysqli_query($conn,"SELECT * FROM video ORDER BY video_id DESC LIMIT $start,$limit");
while($r_video=mysqli_fetch_assoc($video)){
$cat_info=mysqli_query($conn,"SELECT * FROM category WHERE cat_id IN ({$r_video['video_cat']}) ORDER BY cat_sort ASC");
while($r_cat=mysqli_fetch_assoc($cat_info)){
$list_cat.='<a href="/category/'.$r_cat['cat_name'].'.html">'.$r_cat['cat_name'].'</a>,';
}
$list_cat=substr($list_cat, 0,-1);
echo $r_video['video_name'].'<br>'.$list_cat;
unset($list_cat);
}
?>
答案 0 :(得分:0)
我建议左联接查询。例如,如果要从类别1“音乐”中获取所有视频,则可以执行以下操作:
SELECT c.cat_name, v.video_name, v.video_url FROM video as v LEFT JOIN category as c ON c.cat_id = v.video_cat WHERE c.cat_id = 1;
这将导致包含以下内容的数据集:
cat_name video_name video_url
Music Music Video 1 URL 1
Music Music Video 2 URL 24
有效的SQLFiddle:http://sqlfiddle.com/#!9/8008cc/3
在SELECT
语句中,我们使用别名仅调用所需的列(请注意AS
部分)。我们还基于同一列从两个表中收集数据。这是命令的ON
部分。
LEFT JOIN关键字从左表(表1)返回所有记录,并从右表(表2)返回匹配的记录。如果不匹配,则结果从右侧为NULL。
然后在PHP中,您可以只使用1 while语句来迭代所有结果。
希望有帮助。
更新
这更像是获取标签,然后获取类别,因为您可能有多个。参见:Get all posts for specific tag with SQL
答案 1 :(得分:0)
您可以像其他人所说的那样加入查询,您所面临的问题可能与一个视频可能属于多个类别这一事实有关。
在这种情况下,我将使用一个解析函数根据需要设置值的格式。
我目前无法对此进行测试,但是请看一下文档,我建议您在加入后尝试使用GROUP_CONCAT或CONCAT_WS,以便可以以最佳方式对数据进行分组和返回。
只需抓住已经建议的查询,然后将它们按照您想要的方式进行分组,以便将功能应用于该组并提取值。
希望有帮助。