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

标签 php mysql sql database wordpress

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

如果有帮助的话……所有查询在 SQL 语句的选择部分都有一个公共(public)列。他们都选择了 ID,然后是特定的内容。

因此每个查询都需要 ID 和以下任意一项:post_namepost_titlepost_excerpt

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

所以在我的示例中,我将在以下列中查找:“floor finish”、“floor”或“finish”:post_namepost_title、和 post_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 中提取值。从而使结果不准确。

我读过几个看似相似的问题,但大多数都没有真正可靠的明确答案......或者......问题/答案更适合单独表上的多个查询。

关于在同一个表上组合多个 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

这可能对您正在尝试做的事情更有用。 Here's a SQLFiddle如果你想看到它的实际效果。

关于php - 将同一张表上的多个 MySQL 查询合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379228/

相关文章:

mysql - SQL 查询? SELECT 这个查询的逆?

php - 我们如何将指数格式从 PHP 转换为实际数字

php - 如何生成 DIV 中包含多个 highcharts 的页面的单个 PDF

MySQL插入锁定的别名表

php - 从数据库中获取数据,没有得到正确的数据

sql - 如果特定情况没有返回结果,则使用 count(*) 显示零

sql - 使用下一行的值将列添加到表中

php - 如何使用 php 跳过安全身份验证 - MySQL 5.6.15?

php - 此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询

php - MySQL 问题 - 列名无效?