我有两个数据表,分别是类别(category table)和视频(video table),如下图所示。我正在查询这个图片(查询mysqli测试)以获取视频及其目录。有没有一种方法可以只使用一个查询,但仍然具有与当前查询相同的结果?
<?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);
}
?>
分类表
视频表
查询mysqli测试
2条答案
按热度按时间kyks70gy1#
您可以像其他人所说的那样加入查询,您面临的问题可能与一个视频可能属于多个类别有关。
在本例中,我将使用一个分析函数来格式化您想要的值。
我目前无法对此进行测试,但在查看文档时,我建议您在加入后尝试group\u concat或concat\ws,以便您可以以最佳方式分组并返回数据。
只需抓取已经建议的查询,并按您想要的方式对它们进行分组,这样您就可以将函数应用于该组并提取值。
希望有帮助。
t8e9dugd2#
我建议使用左连接查询。例如,如果要获取类别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
工作小提琴:http://sqlfiddle.com/#!9/8008立方厘米/3在
SELECT
语句,我们只调用所需的列,使用别名(注意AS
部分)。我们还基于一个公共列从两个表中收集数据。这就是ON
命令的一部分。left join关键字返回左表(表1)中的所有记录,以及右表(表2)中匹配的记录。如果不匹配,则右侧的结果为空。
在php中,您可以使用while语句来迭代所有结果。
希望有帮助。
更新
这更像是获取标签,然后是类别,因为您可能有多个。请参阅:使用sql获取特定标记的所有文章