MySQL。如何通过多列进行选择

标签 mysql sql

我有一个具有以下基本结构的数据库。

create table objects
(
    id int auto_increment primary key,
);

create table object_attribute_values
(
    id int auto_increment primary key,
    object_id int not null,
    attribute_id int not null,
    value varchar(255) null
);

create table attributes
(
    id int auto_increment primary key,
    attribute varchar(20) null,
);

假设属性表有 3 个:

<表类="s-表"> <头> id 属性 <正文> 1 颜色 2 评分 3 大小

我需要选择所有颜色为“黑色”、评级为 IN (5, 10)、大小为 10 的对象。

我知道如何让所有的对象变成黑色

SELECT o.id
FROM objects o
INNER JOIN object_attribute_values oav ON oav.object_id = o.id
INNER JOIN join attributes a ON a.id = oav.attribute_id
WHERE a.attribute = 'color' AND oav.value = 'black'

结果应该是这样的:

<表类="s-表"> <头> object_id 属性 <正文> 1 颜色:黑色,等级:6,尺寸:10 7 颜色:黑色,等级:6,尺寸:10 12 颜色:黑色,等级:9,尺寸:10

最佳答案

您正在处理的是键/值表。我不太喜欢它们,因为它们使查询数据变得更加复杂,并且不能像普通列那样保证一致性(数据类型、强制/可选值)。但有时它们是必要的。

无论如何,查询键/值表的典型方式是通过聚合:

SELECT
  o.id as object_id,
  GROUP_CONCAT(CONCAT(a.attribute, ':', oav.value) ORDER BY a.id SEPARATOR ';') AS attributes
FROM objects o
INNER JOIN object_attribute_values oav ON oav.object_id = o.id
INNER JOIN join attributes a ON a.id = oav.attribute_id
GROUP BY o.id
HAVING SUM(a.attribute = 'color' AND oav.value = 'black') > 0;

HAVING 子句查找所有 color = black 的对象。其他人被解雇。这是可行的,因为在 MySQL 中 true = 1,false = 0,所以我们可以将条件结果相加。

关于MySQL。如何通过多列进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66063120/

相关文章:

sql - 如何确定数据库的类型 - 旧的遗留企业数据库

mysql - latin-1 到 utf-8 数据库

mysql - 来自多个表的计数总和

sql - 集合运算符的 PostgreSQL 实现

sql - 如何按具有相同 id 的另一个表的最高平均值对行进行排序

sql - Oracle如何将多行合并为单行

mysql - 带有子查询的 SELECT 查询中的 IF 和 CASE 语句

PHP - 选择当前使用的数据库

php - Doctrine2 DBAL 的良好替代 DBAL

sql - 从 SQL 文件中 grep 一个句子