在一个查询中获取视频和类别

时间:2018-07-07 01:52:17

标签: php mysql mysqli

我有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);

}
?>

category table

Video table

Query mysqli test

2 个答案:

答案 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,以便可以以最佳方式对数据进行分组和返回。

只需抓住已经建议的查询,然后将它们按照您想要的方式进行分组,以便将功能应用于该组并提取值。

希望有帮助。