0

我有两个表,我需要将它们组合成一个查询(坏软件),来自具有不同模式的表。我可以轻松地伪造一个表来处理模式差异,但更重要的是,我只想要第二个表中基于(连接)第一个表中的信息的行子集。我最后的手段是制作一个存储过程和临时表,但我想知道是否可以通过查询来做到这一点。这是在 MySQL 5.5 中

说我有类似的东西:

Cats           BadCats
----           -------
id             cat_id
name           color
weight         badness
length
color
awesomeness

我想为蓝色结果集中的猫选择所有蓝色猫和坏猫值。喜欢:

SELECT id,name,awesomeness from Cats where color = 'blue'
UNION
SELECT cat_id,null,badness from BadCats
    where BadCats.cat_id = Cats.id
    and BadCats.color = 'blue' -- or BadCats.color = Cats.color

我想做的另一个人为的例子是:

SELECT id,name from Cats c JOIN BadCats bc on bc.cat_id=c.id

但是以某种方式伪造 BadCat 的列,因此连接可以工作。我的存储过程看起来像:

CREATE TABLE temp
SELECT id,name,awesomeness from Cats where color = 'blue' INTO temp
SELECT cat_id,null,badness from BadCats where cat_id in (select distinct id from Cats) INTO temp
return * from temp

或者可能:

CREATE TABLE temp
SELECT cat_id,null,badness from BadCats INTO temp -- same schema
SELECT id,name,awesomeness from Cats LEFT JOIN BadCats on id=cat_id
    where Cats.color = 'blue'

或者更有可能的是,与 Cats 具有相同架构的 BadCats 的视图......

这里的最终目标是通过在 BadCats 中包含与找到的 Cats 匹配的行来获取蓝猫的列表,并了解它们有多棒/坏,因此软件可以根据 id 处理这些行。

4

3 回答 3

1

这不需要是一个 UNION,这只是一个外部连接。

SELECT id, name from Cats c 
LEFT OUTER JOIN BadCats bc on bc.cat_id=c.id
WHERE c.color = 'blue'

无论是否存在匹配的 bc.cat_id,您都可以从 Cats 获得所有蓝猫。

然后,如果BadCats 中存在具有相同 id 的匹配行,则将其加入。
如果给定的猫没有匹配的坏猫,则来自 BadCats 的所有列都被“伪造”为 NULL。

有关连接类型的更多信息,请参阅http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/。值得您花时间学习如何使用它们。

于 2014-06-18T01:18:21.327 回答
1
SELECT id,name,awesomeness from Cats where color = 'blue'

UNION

SELECT cat_id,null,badness from BadCats
    where cat_id in
    ( SELECT id from Cats where color = 'blue')
    and color = 'blue
于 2014-06-18T01:24:55.337 回答
0

根据我刚刚读到的内容,我认为您应该能够做类似的事情:

SELECT c.* FROM Cats as c WHERE c.color="blue"
UNION
SELECT bc.* FROM BadCats as bc WHERE bc.cat_id = c.id

虽然 Here is a W3Schools Article On Left Join这可能是您想要获得的更多内容。同样,有一个 RIGHT Join 和 INNER Join。

我相信,除非我完全误解了你想要做的事情,否则你会想做更多类似的事情

SELECT c.*,bc.* FROM Cats as c, BadCats as bc WHERE c.color="blue" and bc.cat_id = c.id
于 2014-06-18T01:07:37.817 回答