Php 有没有更有效的方法来编写这4个MYSQL查询以使用更少的查询?

Php 有没有更有效的方法来编写这4个MYSQL查询以使用更少的查询?,php,mysql,performance,Php,Mysql,Performance,我现在的问题。我可以将它们合并为更少的数以获得相同的结果吗?我正在尝试将有关跟踪的特定信息输入名为$trail的数组中 $result = mysql_query("SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND `meta_key` = 'location_city' "); $result = mysql_fetch_array($result); $trail[city] = $result[0]; $result

我现在的问题。我可以将它们合并为更少的数以获得相同的结果吗?我正在尝试将有关跟踪的特定信息输入名为$trail的数组中

$result = mysql_query("SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND `meta_key` = 'location_city' ");
$result = mysql_fetch_array($result);
$trail[city] = $result[0];

$result = mysql_query("SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND `meta_key` = 'length' ");
$result = mysql_fetch_array($result);       
$trail[length] = $result[0];

$result = mysql_query("SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND `meta_key` = 'location_state' ");
$result = mysql_fetch_array($result);
$trail[state] = $result[0];

$result = mysql_query("SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND `meta_key` = 'difficulty' ");
$result = mysql_fetch_array($result);
$trail[difficulty] = $result[0];

$result = mysql_query("SELECT guid FROM wp_posts WHERE `post_parent` = $id AND `post_type` = 'attachment' ");
$result = mysql_fetch_array($result);
$trail[image] = $result[0];

这将适用于meta_值:

SELECT meta_value, meta_key
...
WHERE (post_id = $id) AND (meta_key IN ('location_city', 'length', ...)
guid查询最好单独运行。如果您坚持减少到单个查询调用,那么联合就可以了

SELECT 'meta' AS source, meta_value, meta_key
WHERE ...

UNION ALL

SELECT 'guid' AS source, guid, null
FROM ...
WHERE post_parent = $id and post_type = 'attachment'

然后使用此派生的“源”字段确定哪些值属于何处。

这将适用于元值:

SELECT meta_value, meta_key
...
WHERE (post_id = $id) AND (meta_key IN ('location_city', 'length', ...)
guid查询最好单独运行。如果您坚持减少到单个查询调用,那么联合就可以了

SELECT 'meta' AS source, meta_value, meta_key
WHERE ...

UNION ALL

SELECT 'guid' AS source, guid, null
FROM ...
WHERE post_parent = $id and post_type = 'attachment'

然后使用此派生的“源”字段确定哪些值属于何处。

如果希望数据列中,则可以
加入查询:

SELECT lc.meta_value Location_City,
    l.meta_value Location,
    ls.meta_value LocationState,
    d.meta_value Difficulty,
    p.guid
FROM wp_postmeta lc
LEFT JOIN wp_postmeta l
    on lc.`post_id` = l.`post_id`
    and l.`meta_key` = 'length'
LEFT JOIN wp_postmeta ls
    on lc.`post_id` = ls.`post_id`
    and ls.`meta_key` = 'location_state'
LEFT JOIN wp_postmeta d
    on lc.`post_id` = d.`post_id`
    and d.`meta_key` = 'difficulty'
LEFT JOIN wp_posts p
    on lc.`post_id` = p.`post_parent`
    and p.`post_type` = 'attachment'
WHERE lc.`post_id` = $id 
    AND lc.`meta_key` = 'location_city' 

如果您希望数据列中,那么您可以
加入
查询:

SELECT lc.meta_value Location_City,
    l.meta_value Location,
    ls.meta_value LocationState,
    d.meta_value Difficulty,
    p.guid
FROM wp_postmeta lc
LEFT JOIN wp_postmeta l
    on lc.`post_id` = l.`post_id`
    and l.`meta_key` = 'length'
LEFT JOIN wp_postmeta ls
    on lc.`post_id` = ls.`post_id`
    and ls.`meta_key` = 'location_state'
LEFT JOIN wp_postmeta d
    on lc.`post_id` = d.`post_id`
    and d.`meta_key` = 'difficulty'
LEFT JOIN wp_posts p
    on lc.`post_id` = p.`post_parent`
    and p.`post_type` = 'attachment'
WHERE lc.`post_id` = $id 
    AND lc.`meta_key` = 'location_city' 

是的,使用OR或IN for meta_key您是否尝试合并查询?如果是这样,告诉我们你试过什么。你要求做的事在技术上是可能的。此外,4个查询与1个查询的性能完全取决于您设置的索引。一般来说,主键查找速度非常快,因此您不会看到性能上的巨大差异。您应该切换到
error\u reporting(E\u ALL)立即修复所有通知。例如,引用数组键!是的,使用OR或IN for meta_key您是否尝试合并查询?如果是这样,告诉我们你试过什么。你要求做的事在技术上是可能的。此外,4个查询与1个查询的性能完全取决于您设置的索引。一般来说,主键查找速度非常快,因此您不会看到性能上的巨大差异。您应该切换到
error\u reporting(E\u ALL)立即修复所有通知。例如,引用数组键!谢谢这几乎奏效了。它只返回一个“meta_值”和“meta_键”。。。看这里好吧,是的。。你不是在循环中调用fetch,所以你只能检索一行。谢谢@Marc,很抱歉我的无知。不。这不是无知。也许是缺乏经验。每个人都有权犯一些错误。。。别再这样了![/stern]。海汉克斯。这几乎奏效了。它只返回一个“meta_值”和“meta_键”。。。看这里好吧,是的。。你不是在循环中调用fetch,所以你只能检索一行。谢谢@Marc,很抱歉我的无知。不。这不是无知。也许是缺乏经验。每个人都有权犯一些错误。。。别再这样了![/stern]。呵呵,这真是太完美了!我将把它付诸实践,并调整它,如果它完全工作,我会报告回来。谢谢到目前为止,这是完美的作品!我将把它付诸实践,并调整它,如果它完全工作,我会报告回来。谢谢