Mysql SQL-是否可以按行定制列值?

Mysql SQL-是否可以按行定制列值?,mysql,sql,Mysql,Sql,有人知道有没有可能像下表那样。。同时仍然能够使用SELECT查询 +----+-----------+---------------+------------+ | id | listingId | value | identifier | +----+-----------+---------------+------------+ | 1 | 1a | Alaskan Husky | race | | 2 | 1a | High

有人知道有没有可能像下表那样。。同时仍然能够使用SELECT查询

+----+-----------+---------------+------------+
| id | listingId | value         | identifier |
+----+-----------+---------------+------------+
| 1  | 1a        | Alaskan Husky | race       |
| 2  | 1a        | High          | activity   |
| 3  | 1a        | White         | colour     |
| 4  | 1b        | Akita         | race       |
| 5  | 1b        | Medium        | activty    |
| 6  | 1b        | Grey          | colour     |
+----+-----------+---------------+------------+
在仍然能够使用select查询的情况下

+----+-----------+---------------+---------+--------+
| id | listingId | race          | activty | colour |
+----+-----------+---------------+---------+--------+
| 1  | 1a        | Alaskan Husky | High    | White  |
| 2  | 1b        | Akita         | Medium  | Grey   |
+----+-----------+---------------+---------+--------+
我也希望能够搜索这个新的“表”。比方说,用户选择了一个类似以下内容的过滤器:

  • 种族:阿拉斯加哈士奇
  • 活动:中等、高
然后它应该返回1a的listingId

原因是,当所有值都放在不同的行中时,我无法执行正确的选择查询

如您所见,listingId应该是将所有内容组合在一起的变量,并使标识符列中的值成为一个新列

我之所以不使用第二个表作为默认值,是因为每个列表可以有不同的过滤器和过滤器组。我需要能够选择满足用户指定过滤器的特定列表

谢谢。

您可以使用条件聚合:

select min(id) id, listingId, 
       max(case when [identifier] = 'race' then [value] end) race,
       max(case when [identifier] = 'activity' then [value] end) activity,
       max(case when [identifier] = 'colour' then [value] end) colour
from table t
group by listingId;

这可能会奏效,只需几个自连接。我认为有几种方法可以做到这一点,但对我来说,这很容易阅读和维护

CREATE TABLE [dbo].[the_table](
    [id] [int] NULL,
    [listingId] [varchar](50) NULL,
    [value] [varchar](50) NULL,
    [identifier] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT INTO the_table (id, listingId, value, identifier)
VALUES  (1, '1a', 'alaskan huskey', 'race'),
        (2, '1a', 'high', 'activity'),
        (3, '1a', 'white', 'colour'),
        (4, '1b', 'akita', 'race'),
        (5, '1b', 'medium', 'activity'),
        (6, '1b', 'grey', 'colour')

SELECT * FROM 
(SELECT a.id, a.listingID, a.value AS race, b.value as activity, c.value as colour
FROM the_table a
INNER JOIN the_table b
ON a.listingId  = b.listingId 
INNER JOIN the_table c
ON a.listingId  = c.listingId 
WHERE a.identifier = 'race'
AND b.identifier = 'activity'
AND c.identifier = 'colour') AS t
WHERE t.colour = 'white'
输出:


您可以使用
Pivot

DECLARE @MyTable TABLE (Id INT, listingId VARCHAR(20),Value  VARCHAR(20), identifier varchar(20))
INSERT INTO @MyTable VALUES
(1,'1a','Alaskan Husky' ,'race'),
(2,'1a','High' ,'activity'),
(3,'1a','White'  ,'colour'),
(4,'1b','Akita' ,'race'),
(5,'1b','Medium','activity'),
(6,'1b','Grey' ,'colour')

SELECT *
FROM
(
SELECT listingId, identifier,Value FROM @MyTable)t
PIVOT(MIN(Value)
      FOR identifier
      IN (race,activity,colour)
      )p

你正试图改变方向。进一步搜索,或直接在MS reference处搜索PIVOT运算符。(或者等待回答,不会太久;)我会查的,谢谢。可能是重复的谢谢你的建议。我并不十分喜欢预定义变量,因为“标识符”值不是常量。是否可以“自动检测”这些值,并将它们添加为列,以及它们各自的值?另外,如何针对这个新表运行新的SELECT查询?谢谢。您可以编写一些动态SQL,让它根据
identifier
列中的内容查找列名,但这可能会变得非常混乱,需要维护:)我已经更新了答案,以显示如何执行子查询,希望能有所帮助!谢谢你的帮助,伙计,刚刚得到我想要的:)嘿,谢谢你的建议,不幸的是,你的代码无效。你能告诉我代码无效的原因吗?正如我在另一个答案中提到的那样,我已经测试了它,它给出了与您在问题中所显示的相同的输出,如果它能够自动检测标识符列中的值,以及相应的值,那就太好了。并使用筛选条件执行新的select查询。但我现在会亲自调查的。谢谢你的建议。这绝对是最具可读性的答案。我只是稍微编辑了一下你的答案,所以它还做了一个新的select语句,这也是我要求的。这可能对其他人有帮助,再次感谢!