php - 基于引用表值连接表

标签 php mysql database join normalization

有这些表 enter image description here

并给定 post_map.tag_id='1',我想得到: enter image description here

entity_type 表决定要查看的表,即 entity_id 存储在哪个表中。我的主要目标是将此表作为 mysqli::multi_query() 或 mysqli::query() 的结果,即没有 PHP多次来回数据库;这个表可能有很多行,一次获取这个表会更有效率。

到目前为止我的尝试:

  • 我尝试过 JOIN 子句,但我不知道如何使用先前 SELECT 的行值作为 JOIN 子句的表名。
  • 尝试了准备好的语句,但无法形成任何可用的语句。

最佳答案

可以通过 IF() 和 JOIN 来完成。我有适合您的解决方案,运行下面的查询...

SELECT et.type, 
IF(et.type='resource',r.resource_type_id,NULL) AS resource_type_id, 
IF(et.type='resource',r.value,NULL) AS value, 
IF(et.type='user',u.name,NULL) AS name,
IF(et.type='link',l.source,NULL) AS source, 
IF(et.type='link',l.count,NULL) AS count
FROM `post_map` as pm
JOIN `entity_type` as et ON pm.entity_id = et.id
LEFT JOIN `resource` as r ON pm.entity_type_id=r.id
LEFT JOIN `user` as u ON pm.entity_type_id=u.id
LEFT JOIN `link` as l ON pm.entity_type_id=l.id
WHERE pm.tag_id='1'

关于php - 基于引用表值连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28271521/

相关文章:

java - 读取嵌入式 H2 数据库

php - 过滤多对多关系 - Laravel

php - phpunit 中未定义的 action()

phpseclib exec() 返回未格式化的文本?

mysql - 运行多线程代码规范时锁定等待超时

关于提供的绑定(bind)数量的 Python sqlite3 错误

php - Laravel Passport 可以用于验证用户吗?

mysql - SQL- JOIN 来自两个表的两列

mysql - SQL CASE,当列类别 = x 按类别分组时,否则不分组

mysql - 在 MySQL 数据库中存储用户名和密码的最佳实践