2014-02-05 36 views
0

我有这个疑问:移空值从MySQL结果集

SELECT p.status, s.name AS "Senior", j.name AS "Junior", sp.name AS "Sophomore", f.name AS "Freshman" 
FROM matrix p 
LEFT JOIN senior s ON p.id = s.id 
LEFT JOIN junior j ON p.id = j.id 
LEFT JOIN sophomore sp ON p.id = sp.id 
LEFT JOIN freshman f ON p.id = f.id 
ORDER BY f.name, sp.name, j.name, s.name DESC 

它返回这样的结果:

| Senior | Junior | Sohpomore | Freshman | 
------------------------------------------ 
| Value | NULL | NULL  | NULL  | 
| Value | NULL | NULL  | NULL  | 
| Value | NULL | NULL  | NULL  | 
| NULL | Value | NULL  | NULL  | 
| NULL | Value | NULL  | NULL  | 
| NULL | Value | NULL  | NULL  | 
| NULL | NULL | Value  | NULL  | 
| NULL | NULL | Value  | NULL  | 
| NULL | NULL | Value  | NULL  | 
| NULL | NULL | NULL  | Value | 
| NULL | NULL | NULL  | Value | 
| NULL | NULL | NULL  | Value | 

我的问题,是有可能转向第二,第三和第四列'的价值观,使他们都排队(和所有的空值显示在底部)?在此先感谢您的帮助。

顺便说一句,我检索的价值与PHP,万一有帮助。

更新:状态不是唯一的。它只能是2个值,我不会向用户显示。此外,只是为了让我的问题更清晰一点,这就是我想要达到的结果:

| Senior | Junior | Sohpomore | Freshman | 
------------------------------------------ 
| Value | Value | Value  | Value | 
| Value | Value | Value  | Value | 
| Value | Value | Value  | Value | 
| NULL | Value | NULL  | Value | 
| NULL | Null | NULL  | Value | 
| NULL | Null | NULL  | NULL  | 

更新2下面是所有表的结构:我想你

Matrix: ID, Status, Student Name, Major, Class Standing 
Senior: ID, Name 
Junior: ID, Name 
Sophomore: ID, Name 
Freshman: ID, Name 
+1

请显示'matrix'和其他表的示例数据。 –

+0

更新了表结构。 – misdreavus79

回答

0

可以这样做与聚合:

SELECT p.status, max(s.name) AS "Senior", max(j.name) AS "Junior", 
     max(sp.name) AS "Sophomore", max(f.name) AS "Freshman" 
FROM matrix p 
LEFT JOIN senior s ON p.id = s.id 
LEFT JOIN junior j ON p.id = j.id 
LEFT JOIN sophomore sp ON p.id = sp.id 
LEFT JOIN freshman f ON p.id = f.id 
GROUP BY p.status 
ORDER BY f.name, sp.name, j.name, s.name DESC 
+0

没有工作。尝试使用min,也没有骰子。 – misdreavus79

0

我没有足够的声誉留下评论,所以我会问这里;你想让每一行代表什么?有一个'状态'字段 - 这是每个班级表所独有的吗?即如果状态为“A”,是否有且只有一名新生,二年级,三年级和四年级与该状态相对应?

在我(或任何人)可以提供任何类型的解决方案之前,我需要更多地了解您正在使用的数据以及您要完成的工作。

编辑:这是我认为最有可能的最好的选择(我现在无法测试它,所以如果我错过了语法错误,我很抱歉)。它会给你一个很长的,狭窄的学生列表,你可以用它来区分它们在你的CSS中:

SELECT 
    p.status, 
    "senior" AS class, 
    s.name 
FROM 
    matrix AS p 
    JOIN senior AS s 
     ON p.id = s.id 
UNION 
SELECT 
    p.status, 
    "junior" AS class, 
    j.name 
FROM 
    matrix AS p 
    JOIN junior AS j 
     ON p.id = j.id 
UNION 
SELECT 
    p.status, 
    "sophomore" AS class, 
    sp.name 
FROM 
    matrix AS p 
    JOIN sophomore AS sp 
     ON p.id = sp.id 
UNION 
SELECT 
    p.status, 
    "freshman" AS class, 
    f.name 
FROM 
    matrix AS p 
    JOIN freshman AS f 
     ON p.id = f.id; 
+0

状态不是唯一的(本质上,它是注册或不注册),并且与显示的内容无关。我只选择它,所以我可以根据每行的值来更改CSS。 – misdreavus79

+0

@ misdreavus79好吧,我想我看到这里有什么。你正在垂直思考输出,就像一个Excel电子表格。 MySQL并不是真的那样工作,每行都需要表示/ something /。在你的代码中,高级,初级,二年级等没有关系 - 这对Excel来说很好,但是在MySQl中需要在这些字段之间建立关系。我会用可能的解决方案更新我的答案 –

+0

哦,不用担心,我将这些单元格转换为PHP。我只是想知道在SQL中是否有一种简单的方法。 – misdreavus79