php - 在一个查询与多个查询中获取行及其外键行

标签 php mysql database foreign-keys

假设我有三个表(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语法,我没有在真实的数据库中检查过它,这只是设计问题,谢谢

最佳答案

我只会考虑两种选择:

  1. 一个查询:

    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
    
  2. 两个查询:

    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/

相关文章:

javascript - 访问 div 标签的值

php - 计算或返回 PHP 正则表达式中的前导 0

ruby-on-rails - 在 rails 中使用或子句搜索 [IN]

sql - 会计系统设计和数据库

php - 使用 SQL 查询填充 D3.js 饼图

php - 依靠 Zend_Db_Select

php - mysql 左连接限制未按预期工作

php - MySQL - 同一表中相同 ID 的总和值

mysql - 如何在没有任何变化时强制更新 MySQL 记录

database - Grails:从外部加载数据后更新 hibernate