假设我有三个表(MySQL),一个用于用户,一个用于标签,最后一个用于连接它们(多对多关系):
create table user_tag(
user_id int unsigned not null,
tag_id int unsigned not null,
primary_key (user_id, tag_id)
);
我想从数据库中获取完整的用户列表(或至少其中许多用户)以及他们关联的标签。我使用 PHP 作为服务器语言。
所以我的问题是,执行一个 SQL 查询来获取所有信息是否更好,如下所示:
select user.name, user.image, ..., tag.name from user, tag, user_tag
where user.user_id = user_tag.user_id and tag.tag_id = user_tag.tag_id;
或者最好先为用户执行第一次查询,然后获取他们的标签:
select user.name, user.image, ... from user;
然后对于每个用户:
select tag.name from tag, user_tag where tag.tag_id = user_tag.tag_id
and user_tag.user_id = $USERID;
我觉得第二个是更好的选择,但我担心这可能会对数据库进行太多查询(请注意,这是一个通用设计示例,但此模式可以在具有不同表的数据库上多次出现)。
哪个更好?优点和缺点?其他方式?
谢谢
PS:请不要考虑SQL语法,我没有在真实的数据库中检查过它,这只是设计问题,谢谢
最佳答案
我只会考虑两种选择:
一个查询:
SELECT user.user_id, user.name, user.image, ..., tag.tag_id, tag.name FROM user LEFT JOIN user_tag ON user.user_id = user_tag.user_id LEFT JOIN tag ON user_tag.tag_id=tag.tag_id
两个查询:
SELECT user_id, name, image, ... FROM user SELECT user_tag.user_id, tag.tag_id, tag.name FROM user_tag INNER JOIN tag ON user_tag.tag_id=tag.tag_id
如果您有 100 个用户,则没有必要发出 100 次相同的查询。
当我只获取几列时,我通常会选择#1,否则我会选择#2。在本例中,您似乎正在检索相当完整的用户个人资料,因此#2 听起来不错。
关于php - 在一个查询与多个查询中获取行及其外键行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8323240/