2013-01-22 41 views
0

我目前的疑问。我可以将它们合并为较少以获得相同的结果?我正试图将有关轨迹的特定信息放入名为$ trail的数组中。是否有更有效的方法来编写这4个MYSQL查询以使用更少的查询?

$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]; 
+0

是,使用或OR为meta_key – 2013-01-22 18:41:26

+0

你有没有试图合并查询?如果这样向我们展示你的尝试。你要求做的是技术上可行的。此外,4个查询与1个查询的性能完全取决于您设置的索引。通常,主键查找速度非常快,因此您不会看到性能上的巨大差异。 – Dean

+0

您应该切换到'error_reporting(E_ALL);'现在,然后修复所有通知。例如,引用你的数组键! – ThiefMaster

回答

1

如果你想在列中的数据,那么你可以JOIN查询:

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' 
+0

到目前为止,这个作品完美无缺!我将把它付诸实践并调整它,如果它完全正常工作,我会报告回来。谢谢! – Branndon

0
SELECT meta_value FROM wp_postmeta WHERE `post_id` = $id AND (`meta_key` = 'difficulty' OR `meta_key` = 'location_state' OR `meta_key` = 'length' OR `meta_key` = 'location_city') 
+2

为什么不使用'IN'? – ThiefMaster

2

这将为meta_values工作:

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' 

然后使用此派生“源”字段找出哪些值(S)属于其中。

+0

谢谢。这几乎可行。它只返回一个“meta_value”和“meta_key”......见这里http://pastebin.com/e9tFsHzr – Branndon

+0

好吧,是的..你不会在循环中调用获取,所以你只会检索一行。 –

+0

感谢@Marc,对我的无知感到抱歉。 – Branndon

相关问题