我想要这样的东西,不确定我的语法是否正确。 我将用php执行此操作。
SELECT
a.column1,
a.column2,
b.column1,
c.column1,
IF a.column3 NOT NULL
THEN (
SELECT c.column1, c.column2, c.column3, d.column1
FROM table_d d
INNER JOIN table_c c
ON d.column1 = c.column1 AND c.column4 = 1
WHERE d.column2 = a.column3
);
END IF;
FROM table_a a
INNER JOIN table_b b
ON a.column1 = b.column1 AND b.column2 = 1
INNER JOIN table_c c
ON a.column1 = c.column1 AND c.column2 = 1
WHERE
a.column1 = 1000
AND b.column3 = 1
AND c.column3 = 0
ORDER BY
a.column1 ASC
所以输出将是这样的:
如果它在前几列上有多个具有相同数据的行,那就没问题了。像这样:
灰色区域来自外部SELECT ,白色区域来自内部SELECT
请注意,外部和内部select语句都有table_c。如果没有IF声明,我可以这样做吗?
SELECT
a.column1,
a.column2,
b.column1,
c.column1,
cc.column1,
cc.column2,
cc.column3,
d.column1
FROM table_a a
INNER JOIN table_b b
ON a.column1 = b.column1 AND b.column2 = 1
INNER JOIN table_c c
ON a.column1 = c.column1 AND c.column2 = 1
LEFT JOIN table_d d
ON a.column3 = d.column2
INNER JOIN table_c cc
ON d.column1 = cc.column1 AND cc.column4 = 1
WHERE
a.column1 = 1000
AND b.column3 = 1
AND c.column3 = 0
ORDER BY
a.column1 ASC
我觉得有点不对劲。
如果我使用fetch_assoc
怎么办?
甚至可以在一个查询中执行此操作吗?
答案 0 :(得分:1)
尝试这样的事情:
SELECT
a.column1,
a.column2,
b.column1,
c.column1,
IF (a.column3 NOT NULL,c_2.column1,''),
IF (a.column3 NOT NULL,c_2.column2,''),
IF (a.column3 NOT NULL,c_2.column3,''),
IF (a.column3 NOT NULL,d.column4,'')
FROM table_a a
INNER JOIN table_b b
ON a.column1 = b.column1 AND b.column2 = 1
INNER JOIN table_c c
ON a.column1 = c.column1 AND c.column2 = 1
INNER JOIN table_c as c_2
ON d.column1 = c.column1 AND c.column4 = 1
INNER JOIN table_d
ON a.column1 = c.column1 AND c.column2 = 1
WHERE
a.column1 = 1000
AND b.column3 = 1
AND c.column3 = 0
ORDER BY
a.column1 ASC
答案 1 :(得分:0)
要使用fetch_assoc,您需要使用别名,否则您只能通过索引来获取它们。除此之外,它应该有效。
答案 2 :(得分:0)
如果a.column3 NOT NULL THEN
这就是“内部联接”的用途。根据定义,内部真正意味着“只有匹配”。或者,您可以使用左外连接,然后使用“where”以确保不包含此位置中具有NULL的记录。内部联接将过滤掉匹配字段中具有空值的任何记录(即:否匹配=排除此记录)。
如果你想要所有记录,但是如果链接表没有记录那么你想要在这些字段中显示空白......那就是左外连接的用途。再一次,这实际上是定义。 8 - )
如果你通过fetch_assoc引用PHP函数,你应该考虑切换到mysqli而不是mysql,它允许更容易获得的“索引或名称”字段关联。但无论如何,内部联接可以消除使用“as XXXX”字段名称别名的需要。