【问题标题】:Use Mysql JOIN on column value as column name with another table column name在列值上使用 Mysql JOIN 作为列名和另一个表列名
【发布时间】:2017-05-11 04:56:22
【问题描述】:

我想将表的列值用作列名,并将其用作与另一个表列名的 JOIN ON 值。以下是我的查询。

SELECT nid, sid, 
       MAX(CASE WHEN cid = 2 THEN data END) first_name,
       MAX(CASE WHEN cid = 3 THEN data END) last_name,
       MAX(CASE WHEN cid = 4 THEN data END) email,
       MAX(CASE WHEN cid = 5 THEN data END) phone_number,
       MAX(CASE WHEN cid = 6 THEN data END) transitions,
       MAX(CASE WHEN cid = 7 THEN data END) **upload**,
       MAX(CASE WHEN cid = 9 THEN data END) coupon_code
  FROM wsd AS wsd JOIN files AS fm ON **upload** = fm.fid WHERE nid IN(66,67) GROUP BY sid

正如您看到上面的代码,我想使用上传列作为另一个表的 JOIN。另外,是否可以在结果中嵌入 HTML 标签?

【问题讨论】:

  • 您应该查看查询执行的顺序,以了解为什么您不能在像您这样的查询中引用连接子句中的别名。 sqlbolt.com/lesson/select_queries_order_of_execution
  • 这个问题似乎分为两部分。如果是这样,我不明白第一部分。
  • 你能发布表结构和一些插入查询以获得一些测试数据吗?干杯
  • @Ognj3n,谢谢。好的,而不是别名,如何使用列值作为列名来使用它作为连接ON

标签: php mysql join multiple-columns


【解决方案1】:

我尝试使用临时表获取结果。这是我的答案。

CREATE TEMPORARY TABLE IF NOT EXISTS my_temp_table SELECT sid, cid, data FROM wsd WHERE cid = 7 AND nid IN (66,67);
SELECT wsd.nid, wsd.sid, fm.filename, 
       MAX(CASE WHEN wsd.cid = 2 THEN wsd.data END) fn,
       MAX(CASE WHEN wsd.cid = 3 THEN wsd.data END) ln,
       MAX(CASE WHEN wsd.cid = 4 THEN wsd.data END) email,
       MAX(CASE WHEN wsd.cid = 5 THEN wsd.data END) ph,
       MAX(CASE WHEN wsd.cid = 6 THEN wsd.data END) tr,
       MAX(CASE WHEN wsd.cid = 7 THEN wsd.data END) upr,
       MAX(CASE WHEN wsd.cid = 9 THEN wsd.data END) coc
  FROM wsd wsd JOIN my_temp_table ON wsd.sid = my_temp_table.sid JOIN files fm ON my_temp_table.data = fm.fid WHERE nid IN(66,67) GROUP BY wsd.sid;

代替临时表,更好的查询如下:

SELECT wsd.nid, wsd.sid, fm.filename, 
           MAX(CASE WHEN wsd.cid = 2 THEN wsd.data END) fn,
           MAX(CASE WHEN wsd.cid = 3 THEN wsd.data END) ln,
           MAX(CASE WHEN wsd.cid = 4 THEN wsd.data END) email,
           MAX(CASE WHEN wsd.cid = 5 THEN wsd.data END) ph,
           MAX(CASE WHEN wsd.cid = 6 THEN wsd.data END) tr,
           MAX(CASE WHEN wsd.cid = 7 THEN wsd.data END) upr,
           MAX(CASE WHEN wsd.cid = 9 THEN wsd.data END) coc
      FROM wsd wsd LEFT JOIN files fm ON wsd.data = fm.fid WHERE nid IN(66,67) GROUP BY wsd.sid;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多