【问题标题】:Conditional Queries Among Multiple Tables多表条件查询
【发布时间】:2011-06-25 09:32:03
【问题描述】:

您好,感谢您查看我的问题,希望您能提供一些见解或方向。

我有三个表(基本上):“value_meta”、“value”和“values_visibility”。架构如下:

TABLE 'value_meta'

COMMENT: contains a list of different values, each referencing a different 'value' table

int id PK

tinyint value1 FK to value1.value

tinyint value2 FK to value2.value

tinyint value3 FK to value3.value

...



TABLE 'value'

COMMENT:  there are different value tables (for example, if it were for user profile data, there would be a value table for "occupation", "body type", and/or "education level"

tinyint id PK

varchar(255) value



TABLE 'value_visibility'

COMMENT:  one value visibility entry per value[n] in the 'value_meta' table, each a boolean value.  If 1, the coding query will return the value as rerefenced in 'value[n]' table.  if 0, return null
int id PK

BOOLEAN 'value1_visibility'

BOOLEAN 'value2_visibility'

BOOLEAN 'value3_visibility'

....

我想要做的是创建一个适当的 MySQL 查询来检查“对于 'value_meta' 中的每个 'value',如果 'value_visibility' 中的相应值条目为 1,则显示 value varchar。否则返回 null”。适当地,我想让它最有效(派生表与相关子查询、适当的条件和函数使用......我听说 ISNULL 很糟糕)。

我曾经擅长于在大学时直接从脑海中构建查询,但在多年不使用它之后,我已经变成了比扫帚还差三根稻草的人。谁能帮我?谢谢!

【问题讨论】:

  • 你从哪里听说ISNULL不好?

标签: mysql join performance conditional


【解决方案1】:
SELECT vm.id,
    IF(vv.id IS NULL, NULL, vm1v.value) value1,
    IF(vv.id IS NULL, NULL, vm2v.value) value2,
    IF(vv.id IS NULL, NULL, vm3v.value) value3
FROM value_meta vm 
    LEFT JOIN value vmv1 ON vm.value1 = vmv1.id
    LEFT JOIN value vmv2 ON vm.value1 = vmv2.id
    LEFT JOIN value vmv3 ON vm.value1 = vmv3.id
    LEFT JOIN value_visibility vv ON vm.id = vv.id AND vv.value1_visibility = 1

您应该考虑重组您的 value_meta 表,是否有理由将 value1 2 和 3 存储在同一行中?

【讨论】:

  • 完美,我现在离正确的轨道更近了。并感谢您的快速响应。 “value_meta”表包含一个对不同上下文唯一的主键。所以回到假设的个人资料,每一行将是一个不同的用户数据,用于数字、职业和/或教育水平。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2021-09-23
  • 2023-03-12
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多