我有两张ticket号桌和attr号桌.表ticketticked_id个字段和几个其他字段.表attr有3个字段:

ticket_id - numeric
attr_type - numeric
attr_val - string

attr_type是一个固定的值枚举.例如,它可以是123.

我需要做一个查询,结果将是4列:

ticket_idattr_val代表attr_type=1attr_val代表attr_type=2attr_val代表attr_type=3

如果attr表中的attr_type没有对应的值,那么相应的列中应该显示空值.

例子:

ticket
    ticket_id: 1

    ticket_id: 2

    ticket_id: 3


attr
    ticket_id: 1
    attr_type: 1
    attr_val: Foo

    ticket_id: 1
    attr_type: 2
    attr_val: Bar

    ticket_id: 1
    attr_type: 3
    attr_val: Egg

    ticket_id: 2
    attr_type: 2
    attr_val: Spam

结果应该是:

ticked_id: 1
attr_val1: Foo
attr_val2: Bar
attr_val3: Egg

ticked_id: 2
attr_val1: NULL
attr_val2: Spam
attr_val3: NULL

ticked_id: 3
attr_val1: NULL
attr_val2: NULL
attr_val3: NULL

我三次try 左键连接attr个表,但都不知道如何按attr_type排列输出

推荐答案

您需要使用多个LEFT JOINs:

SELECT 
    ticket.ticket_id,  
    a1.attr_val AS attr_val1,
    a2.attr_val AS attr_val2,
    a3.attr_val AS attr_val3
FROM ticket
    LEFT JOIN attr a1 ON ticket.ticket_id=a1.ticket_id AND a1.attr_type=1
    LEFT JOIN attr a2 ON ticket.ticket_id=a2.ticket_id AND a2.attr_type=2
    LEFT JOIN attr a3 ON ticket.ticket_id=a3.ticket_id AND a3.attr_type=3

这里有一个例子:SQL Fiddle.

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

查找关联数据库表的超集

为什么IN子句中有GROUP BY会导致查询变得不可执行?

如何让Docker MySQL使用Unicode(utf-8)和初始化脚本?

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

MySQL match against给出奇怪的结果

mysqli 无法以非 root 用户身份连接

在 MySQL 中使用非空条件 LAG() 函数

mySql 查询运行速度超慢

多个驱动器上的 MYSQL 数据

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

在 where 子句中左连接多个值

MYSQL除以零警告,奇怪的行为

SQL从字典中的键获取值

从 SQL 中的左连接和内连接中减go 计数

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

基于两个单元格值的 SQL 过滤表

MySQL 整数与日期时间索引

使用 mysql 处理非常大的数据

什么是mysql的BETWEEN性能超过..?