【问题标题】:Creating a new column in mysql view from an existing value从现有值在 mysql 视图中创建新列
【发布时间】:2015-10-24 23:12:02
【问题描述】:

我对此非常陌生,所以如果我能澄清一下,请告诉我。本质上,我希望根据现有表中列的值在 mysql 视图中创建一个新列。我正在使用phpGrid在前端输出。

例如 - 假设我有现有的列 question_id

    name | question_id | answer
----------------------------------
    Joe  | 1           | yes
    Joe  | 2           | no
    Ann  | 1           | maybe
    Ann  | 2           | kinda

并且我有自定义视图 my_view,我希望列是这样的(不一定要在前面有 question_id=,但不管用):

    name  | question_id=1 | question_id=2
------------------------------------------
    Joe   | yes           | no
    Ann   | maybe         | kinda

或者类似的东西。如何让 question_id 值成为列,并将答案放在正确的位置?

另外,如果name 来自一个表,而question_id 来自另一个表,我如何才能在my_view 中获得正确关联的值? name 值通常有重复项,但它们有单独的条目 ID。

干杯,谢谢!

编辑: Create MySQL view using distinct values as columns 是正确的想法,但我收到错误 #1064 关于不正确的语法。

另外,我不确定它是否解决了第二个问题,即通过唯一条目 ID 对齐数据。我尝试使用这个:1052: Column 'id' in field list is ambiguous 来解决模棱两可的问题,但随后我收到错误 #1060,表示存在重复。

编辑 2: 这是我用来尝试从两个单独的表中获取列的代码,包括两个表中都存在的共享 registration_id 列。我从上面的帖子中得到了关于解决模棱两可问题的代码:

CREATE VIEW access AS
    SELECT fname,lname,email,city,state,country_id,phone,payment_status,event_id,wp_events_attendee.registration_id,wp_events_answer.registration_id,question_id,answer
    FROM wp_events_answer
    JOIN wp_events_attendee ON wp_events_attendee.registration_id = wp_events_answer.registration_id 

它给了我“#1060 - Duplicate column name 'registration_id'”。也不确定如何将其集成到Create MySQL view using distinct values as columns 中看到的代码中。我试着做一个测试:

  CREATE VIEW access AS
SELECT
    fname,lname,email,city,state,country_id,phone,payment_status,event_id,wp_events_attendee.registration_id,wp_events_answer.registration_id,question_id,answer,registration_id,
    MAX(IF(question_id = '1', status, NULL)) FIRST,
    MAX(IF(question_id = '11', status, NULL)) DOB,
FROM wp_events_answer, wp_events_attendee
JOIN wp_events_attendee ON wp_events_attendee.registration_id = wp_events_answer.registration_id 
GROUP BY registration_id;

但得到“#1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在第 6 行的“FROM wp_events_answer, wp_events_attendee GROUP BY registration_id”附近使用的正确语法”。谢谢!

【问题讨论】:

标签: mysql phpgrid


【解决方案1】:

假设您提前知道问题 ID,这可以通过一堆 UNION 来实现 - http://sqlfiddle.com/#!9/00a0c/8

恐怕我需要一些样本数据来回答您问题的第二部分。

更新 - 我没有意识到额外的行是一个问题。下面的 SQL fiddle 解决了这个问题。

http://sqlfiddle.com/#!9/0f8c7/2

【讨论】:

  • 感谢您的建议。看起来有点过头了,但我会探索。至于第二个问题,我提到的表存储事件注册数据。所以'name' 将注册多个事件,并回答相同的问题,但条目将由registration_id 分隔。一张表存储他们的姓名、电子邮件和registration_id。另一个存储他们对自定义问题的答案,但使用相同的registration_id将它们链接在一起。问题:当我创建视图时,它不会链接正确行中的数据。我试图修复它但出现错误(有关详细信息,请参阅我的编辑)。再次感谢!
  • 试试这个 - sqlfiddle.com/#!9/10b28/13 你的代码有几个问题:1)你在 DOB 之后有一个不必要的逗号 2)我认为 FROM 应该只跟一个表名(另一个在 JOIN 中引用)3)您的 IF 语句指的是表模式中不存在的列“状态”。我建议对 SQL JOINS 进行一些研究,以更好地了解如何从多个表中提取数据。 w3schools.com/sql/sql_join.asp
  • 谢谢 - 但这仍然会为“Bob”和“Joe”创建两个不必要的行。即使我调整了那里的值以使每个人在每一列中都有一个答案,他们仍然将所有内容都分隔在多行中。
  • 我重新编写了代码以匹配我正在使用的代码 - 并对其进行了简化以进行测试 - 并采纳了您的建议,但我仍然收到“#1064 - 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 4 行的 '1, IF(question_id = '11', answer, NULL) 11 FROM wp_events_answer GROUP BY' 附近使用“CREATE VIEW access AS SELECT registration_id, MAX(IF(question_id = '1', answer, NULL)) 1, MAX(IF(question_id = '11', answer, NULL)) 11 FROM wp_events_answer GROUP BY registration_id;
  • 我稍微修改了数据和示例以删除额外的行。每个受访者的答案现在都显示在一行中。我猜你的陈述由于列名而不起作用。尝试写“AS question_1”而不是简单的“1”MAX(IF(question_id = '1', answer, NULL)) AS question_1
【解决方案2】:

我对 sql 视图了解不多,但是在连接表时,您的查询似乎有问题。

如果您需要连接 3 个表,请按照以下查询。

SELECT `table1`.`column1`,`table2`.`column2` 
FROM `table1` 
JOIN `mapping_table` 
JOIN `table2` 
ON `table1`.`table1_id`=`mapping_table`.`table1_foreign_key` 
AND `mapping_table`.`table2_foreign_key`=`table2`.`table2_id` 
GROUP BY `table1`.`group_column` 

希望这将帮助您创建所需的视图

【讨论】:

  • 您好,谢谢!我需要加入两张桌子,而不是三张。我认为我没有正确调整它,我不清楚映射表或外键代表什么?感谢您的帮助。
  • 如果你只需要加入两张桌子,那就更容易了。您不需要映射表。外键用于在 2 个表之间建立关系(我建议您对此进行更多研究)。此示例 w3schools.com/sql/sql_foreignkey.asp 还将让您更好地了解外键。我需要知道列 fname,lname,email,city,state,country_id,phone,payment_status,event_id,answer,re‌​gistration_id 属于哪个表/表,以便我可以为您提供有更好的答案
猜你喜欢
  • 2019-08-15
  • 2013-06-15
  • 2021-01-02
  • 1970-01-01
  • 2019-12-27
  • 2017-01-27
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多