显示标准化数据

时间:2016-09-28 08:19:05

标签: php mysql

跟进问题来自: Adding sum from 2 different tables

我创建了3个表: members videos video_member

第三个用于链接'前两个表,因为一个成员可以属于许多视频,一个视频可能有很多成员。

enter image description here

我过去只在视频表中有一个members列,我会把成员放在那里:

video_id | members
 1       | Tom,Dan
 2       | Casey,Zack,Bob
 3       | Tom,Casey,Dan,Zack
 4       | Zack,Bob,Dan

在我的PHP项目中,我将查询视频表中的数据,并使用Twig模板引擎,我将使用for循环遍历每一行并创建一个类似于页面的图库。每个框都是'带有缩略图,下面是视频表中的数据。

我需要单独显示成员,以便每个成员都有自己的链接。所以我会用逗号分割字符串。 (例如:凯西,扎克,鲍勃)进入一个阵列然后只是循环通过它。

在我发布的图片中使用我的新格式,我将如何展示会员?

我做了什么: 这就是我在video.php中的内容。

$sql = 'SELECT * FROM videos';
$sql2 = 'select v.video_id "v_id", m.name "name" from videos v, video_member b, members m where b.video_id = v.video_id and b.member_id = m.member_id';

$result = $mysqli->query($sql);
$result2 = $mysqli->query($sql2);

echo $twig->render('video.html', array('videos'=> $result, 'members' => $result2));

然后我使用第一个结果从我的videos.html中的视频表输出数据

{% for v in videos %}
*html layout*
{% endfor %}

因为我有一个for循环遍历视频中的每一行,所以我在循环中添加了这个

{% for m in members %}

{% if v.video_id == m.v_id %} <a href='{{memberurl}}/{{m.name}}/'>{{m.name}}</a>

{% endif %}
{% endfor %}

所以这个想法是:每次从videos遍历一行时,它会检查用我的$ sql2创建的新表中的video_idv_id(fk),如果有的话匹配它会显示这些名称。

$ SQL2: enter image description here

现在它以这种方式工作,我现在只需要实现逗号但是......

我主要学习创建和使用规范化数据,并想知道我是否在正确的道路上,因为我想用标签和未来的项目实现这一点。这是展示会员的正确/精细方式吗?

我对很多这方面都很陌生,每次我学到新东西感觉都很棒,感谢您的帮助!

video.html enter image description here

1 个答案:

答案 0 :(得分:0)

在大多数情况下,您在单个查询中返回所需的所有数据,并将其放在页面上。

例如,您可以像这样运行单个查询:$sql2 = 'select * from videos v, video_member b, members m where b.video_id = v.video_id and b.member_id = m.member_id';然后在您的前端代码中包含逻辑,当videoID更改为绘制您的下一个视频框时。

您正在做的是加入模板中的两个数据集;这是低效的,特别是如果你有复杂的查询,或者你有一个过滤器(例如像“Ferris%”这样的“videoName”)。