【发布时间】:2015-06-05 10:01:11
【问题描述】:
如何在同一张表上进行多个查询,选择不同的列?
如果它有帮助...所有查询在 SQL 语句的选择部分都有一个公共列。他们都选择ID,然后选择特定的内容。
因此,每个查询都需要 ID 和以下任一:post_name、post_title 或 post_excerpt。
如果它有助于简化事情。我正在尝试在这些列中搜索广泛匹配和完全匹配。
因此,在我的示例中,我将在以下列中查找:“地板饰面”、“地板”或“饰面”:post_name、post_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_title 或 post_excerpt。
所以每个结果都有一个ID 和post_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%' ))
)
)
这更符合我想要完成的目标。我希望每个结果都有ID、post_excerpt、post_slug 和post_title。如果不匹配,则将它们的键显示为空值,或者完全不显示键。
第二次尝试的问题在于,它只需要在所需的三个列之一中进行匹配。因此,如果它在post_excerpt 中匹配并且没有在其他位置匹配,它仍然会从post_title 和post_name 中提取值。从而导致结果不准确。
我已经阅读了几个看似相似的问题,但大多数都没有真正可靠的明确答案......或者......问题/答案更适合 SEPARATE 表上的多个查询。
对在同一张表上组合多个 MySQL 查询有任何指导或建议吗?
顺便说一句...我在两个示例中都使用“组合”作为发送到数据库的最终查询。
所以再一次...如果列中没有匹配项,则将它们的键显示为 null 或完全从结果中完全省略键。
【问题讨论】:
标签: php mysql sql database wordpress