Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql:将同一列作为不同列多次查询,每行返回1个值_Sql_Moodle - Fatal编程技术网

sql:将同一列作为不同列多次查询,每行返回1个值

sql:将同一列作为不同列多次查询,每行返回1个值,sql,moodle,Sql,Moodle,我需要构建一份结构如下的报告: 名称、字段_1、字段_2、字段_3 吉姆,选择1,y,12 简,选择2,n,64 等等 我从Moodle数据库表中提取,结构如下图所示,mdl_用户和其他用户有相同的列,我从中得到的只是名称,所以我不想在这里包含它。那部分很好用 以下是迄今为止我能想到的最好的方法,您可以看到表是如何连接的: SELECT CONCAT (u.firstname, u.lastname) Name, (SELECT d.data FROM mdl_user_info_data

我需要构建一份结构如下的报告:

名称、字段_1、字段_2、字段_3

吉姆,选择1,y,12

简,选择2,n,64

等等

我从Moodle数据库表中提取,结构如下图所示,mdl_用户和其他用户有相同的列,我从中得到的只是名称,所以我不想在这里包含它。那部分很好用

以下是迄今为止我能想到的最好的方法,您可以看到表是如何连接的:

SELECT 
CONCAT (u.firstname, u.lastname) Name, 
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_1" GROUP BY d.userid), 
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_2" GROUP BY d.userid),
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_3" GROUP BY d.userid),

FROM mdl_user u 
JOIN mdl_user_info_data d ON d.userid = u.id 
JOIN mdl_user_info_field f ON d.fieldid = f.id
GROUP BY d.userid
ORDER BY `Name` ASC
我知道我用我的子查询找错了方向,但不知道该做什么来代替分组查询。当我只需要返回与第1列中命名的用户对应的值时,我当前的查询将返回每行中每个给定字段的所有值


非常感谢您的帮助。

我对moodle或它的sql语法不太肯定,但如果很常见,您可能需要多次执行表的左连接,每个左连接都有其条件限定,然后只需使用不同的别名引用来获得您的片段

SELECT 
      CONCAT (u.firstname, u.lastname) Name, 
      dFld1.Data as Field1Data,
      dFld2.Data as Field2Data,
      dFld3.Data as Field3Data
   FROM 
      mdl_user u 
         LEFT JOIN mdl_user_info_data dFld1
            ON u.id = dFld1.userid 
            LEFT JOIN mdl_user_info_field fFld1
               ON dFld1.fieldid = fFld1.id
              AND fFld1.shortname = "Field_1"
         LEFT JOIN mdl_user_info_data dFld2
            ON u.id = dFld2.userid 
            LEFT JOIN mdl_user_info_field fFld2
               ON dFld2.fieldid = fFld2.id
              AND fFld2.shortname = "Field_2"
         LEFT JOIN mdl_user_info_data dFld3
            ON u.id = dFld3.userid 
            LEFT JOIN mdl_user_info_field fFld3
               ON dFld3.fieldid = fFld3.id
              AND fFld3.shortname = "Field_3"
   ORDER BY 
      `Name` ASC
如果任何这样的链接可能没有值,我有一个带有左连接的查询


对于group by,仅当给定用户的一个或多个基础表以及字段1、2或3分别有多个条目时,才需要此选项。

另一种解决方案

SELECT u.id, u.firstname, u.lastname, f.fieldname1, f.fieldname2
FROM mdl_user u
JOIN (
    SELECT d.userid,
      MAX(CASE WHEN f.shortname = 'fieldname1' THEN d.data ELSE null END) AS fieldname1,
      MAX(CASE WHEN f.shortname = 'fieldname2' THEN d.data ELSE null END) AS fieldname2
    FROM mdl_user_info_field f
    JOIN mdl_user_info_data d ON d.fieldid = f.id
    WHERE f.shortname IN ('fieldname1', 'fieldname2')
    GROUP BY d.userid) f ON f.userid = u.id
Concat将适用于MySql,但您应该使用与数据库兼容的函数-

因此,使用

$DB->sql_concat('u.firstname', 'u.lastname');

为了更加清晰:我知道我可以使用“groupu CONCAT(d.data ORDER BY d.userid)”字段1、字段2、字段3”,但项目规范要求每个字段有单独的列,而不是一个逗号分隔的CONCAT列。但愿如此!工作得很好。非常感谢。如果你有任何最喜欢的SQL学习资源,我也愿意在那里接受推荐。