繁体   English   中英

将同一表上的多个MySQL查询合并为一个

[英]Combine Multiple MySQL Queries on the Same Table Into One

您如何在同一个表上进行多个查询,选择不同的列?

如果有帮助...所有查询在SQL语句的select部分中都有一个公共列。 他们都选择ID ,然后是特定的内容。

因此,每个查询都需要ID和以下任意一个IDpost_namepost_titlepost_excerpt

另外,如果它有助于简化操作。 我正在尝试在这些列中搜索广泛匹配和完全匹配。

因此,在我的示例中,我将在以下几列中寻找:“ floor finish”,“ floor”或“ finish”: post_namepost_titlepost_excerpt 全部在同一张表中。

我试图通过UNION完成此任务。

这是我的查询:

Array
(
    [broad] => Array
        (
            [floor] => Array
                (
                    [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor%'
                    [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor%'
                    [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor%'
                )

            [finish] => Array
                (
                    [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%finish%'
                    [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%finish%'
                    [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%finish%'
                )

        )

    [exact] => Array
        (
            [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor-finish%'
            [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor finish%'
            [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor finish%'
        )

    [combined] => ( SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor-finish%' ) UNION ( SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor%' ) UNION ( SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%finish%' ) UNION ( SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor finish%' ) UNION ( SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor%' ) UNION ( SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%finish%' ) UNION ( SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor finish%' ) UNION ( SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor%' ) UNION ( SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%finish%' )
)

但是,上述结果很有趣。 我似乎得到了所有正确的结果,但每个结果值的键(应该是列的名称)始终保持不变。 它总是post_name即使分配给它的值可能是一个post_titlepost_excerpt

因此,每个结果都有一个IDpost_name 基本上,它们的键是错误的,但是值看起来是准确的。

我也尝试过这样的事情:

Array
        (
            [broad] => Array
                (
                    [floor] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%floor%' OR `post_title` LIKE '%floor%' OR `post_excerpt` LIKE '%floor' )
                    [finish] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%finish%' OR `post_title` LIKE '%finish%' OR `post_excerpt` LIKE '%finish%' )
                )

            [exact] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%floor-finish%' OR `post_title` LIKE '%floor finish%' OR `post_excerpt` LIKE '%floor finish%' )
            [combined] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%floor-finish%' OR `post_title` LIKE '%floor finish%' OR `post_excerpt` LIKE '%floor finish%' ) UNION (SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%floor%' OR `post_title` LIKE '%floor%' OR `post_excerpt` LIKE '%floor%' )) UNION (SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND ( `post_name` LIKE '%finish%' OR `post_title` LIKE '%finish%' OR `post_excerpt` LIKE '%finish%' ))
        )

)

这更符合我要完成的工作。 我希望每个结果都具有IDpost_excerptpost_slugpost_title 如果没有匹配项,则将其键显示为空值,或者完全不显示键。

第二次尝试的问题是它只需要在三个所需列之一中进行匹配即可。 因此,如果在post_excerpt匹配,并且在其他任何地方都没有匹配,它将仍然从post_titlepost_name post_title值。 因此使结果不准确。

我已经阅读了几个看似相似的问题,但是大多数问题并没有真正可靠的明确答案...或...这些问题/答案更适合于SEPARATE表上的多个查询。

有关在同一表上组合多个MySQL查询的任何指导或建议?

顺便说一句...我在两个示例中都使用“组合”作为我的最终查询,以发送到数据库。

因此,再等等一次...如果一列中没有匹配项,则将其键显示为null或完全从结果中完全省略键。

由于查询中的UNION语句,您获得了错误的“键”。 您具有不同的键名,但是在联合查询的三个不同列之间具有兼容的列类型。 数据库引擎没有抛出错误,而是从第一个查询中选择列名称,然后对所有列使用该名称:

id | post_name # <= column name in first query
1  | "my post"

UNION

id | post_title # <= column name is different, but type is compatible, so UNION succeeds
1  | "my post title"

UNION

id | post_excerpt # <= ditto
1  | "my post excerpt"

会导致:

id | post_name # <= column name from first query
1  | "my post"
1  | "my post title"
1  | "my post excerpt"

这就是你正在经历的。

相反,您可以执行以下操作:

id | post_name | post_title | post_excerpt
1  | "my post" | null       | null        # <= deliberately select nulls for these columns in this query

UNION

id | post_name | post_title      | post_excerpt
1  | null      | "my post title" | null

UNION

id | post_name | post_title | post_excerpt
1  | null      | null       | "my post excerpt"

这将给您以下结果:

id | post_name | post_title      | post_excerpt
1  | "my post" | null            | null
1  | null      | "my post title" | null
1  | null      | null            | "my post excerpt"

在您的表中,一个非常基本的版本可能看起来像:

SELECT ID, post_name, null AS post_title, null AS post_excerpt FROM tps_3_posts

UNION

SELECT ID, null AS post_name, post_title, null AS post_excerpt FROM tps_3_posts

UNION

SELECT ID, null AS post_name, null AS post_title, post_excerpt FROM tps_3_posts

这对于您正在尝试做的事情可能更有用。 如果您想查看它的运行,请使用SQLFiddle

正如我在第二种情况下所理解的那样,问题在于只有匹配的列才应具有值,而其他列应为null。 对于这种情况,可以在SELECT中使用IF / ELSE或WHEN语句。 想法是您选择实际值,该列的值对应于期望值,否则为null。

另一个潜在的解决方案是您可以编写例如

SELECT `ID`, `post_name`, `post_title`, 'post_excerpt'

因此,您选择的字符串值是WHERE语句中的条件,以后可以使用该值来了解该行所属的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM