我的MySQL视图有问题。
TL; DR: *如果我按正常查询运行查询:使用左右连接发回适当的结果;
但是,如果我将它们用作视图 (创建视图为...)SQL服务器本身正在改变单词。*
当我创建一个没有联合的视图时 - 它工作正常。但是...... MySQL不支持FULL OUTER JOIN,因此我必须使用union连接左右连接以获得我的结果。
现在,当我使用union创建或编辑视图时,我必须在“as”之后和查询结束时删除paranthesis,因为它不能以其他方式工作。
现在,主要问题。也许就是一个例子:
select * from y LEFT join x on [..]
UNION
select * from y RIGHT join x on [...]
正如你所看到的那样,只有不同的词语:LEFT和RIGHT。
[edit]我可以将第一个'左'更改为'右',它也会被替换。
当我接受并发送此查询时,没有任何错误或警告。
但是,视图没有向我显示正确的结果,所以现在我检查视图。我用sqlyog打开它(改变),看看有什么不对,什么? 它看起来像这样:
select * from y LEFT join x on [..]
UNION select * from y LEFT join x on [...]
你知道吗? “正确”一词已被替换为“左”。 [是的,联盟后的输入跳过了自己]
sqlyog本身不会改变它因为结果不正确,所以mysql服务器正在这样做。
为什么呢?这是我的错吗?
另外,如果我想添加'OUTER'字样,它就会被跳过。重新打开后,“right”一词被替换,“outer”被删除。
现在我将尝试通过创建2个视图来克服它,一个用右边,一个用左边连接,在第三个视图中加入它们......但是视图不使用索引,所以性能会很糟糕......
答案 0 :(得分:0)
left
和right
联接之间没有区别,除了已经切换了联接的“基本”表这一事实。
select *
from table1
left join table2 on table1.id = table2.id
相当于
select *
from table2
right join table1 on table1.id = table2.id
这是一个SQLFiddle,展示left
与right
连接的相似之处:
http://sqlfiddle.com/#!2/ceac6f/5
如果outer
不是inner
加入,则会隐含{{1}}。
您将不得不提供有关结果“不正确”的更多信息,因为您没有提供足够的信息来表明您的期望,获得的内容以及您认为错误的原因。
答案 1 :(得分:0)
我建议您对结果集中所需的列进行顽固明确的说明。而不是使用SELECT *
,枚举列。并且,请确保以某种方式使用别名列名称,以便最终不会出现重复的名称。例如。
SELECT a.id, a.thisval, a.thatval,
b.id AS bid,
b.thisval AS bthisval,
b.thatval AS bthatval,
b.the_otherval
FROM y AS a
LEFT JOIN x AS b ON a.id = b.id
UNION
SELECT a.id, a.thisval, a.thatval,
b.id AS bid,
b.thisval AS bthisval,
b.thatval AS bthatval,
b.the_otherval
FROM y AS a
RIGHT JOIN x AS b ON a.id = b.id
编写查询更难,但您可以避免结果集的列命名中存在一些歧义。这种模棱两可可能会搞得一团糟。
答案 2 :(得分:0)
我找到了解决方案:
在group by
中使用view
的工作方式与普通查询不同。
如果您使用view
并在group by
的查询中使用view
,则其工作方式与仅在group by
中设置view
和然后在没有view
的情况下向此group by
发送查询。
它应该像这样工作吗?真的不知道。也许我刚刚打破了MySQL。
案件结案。