需要帮助组成疯狂的复杂嵌套MySQL查询,返回简单数组

时间:2014-02-13 09:37:06

标签: php mysql join

我有一段时间了 - 我有一个只有4列的表,可以定义3到20位的信息。我甚至不确定如何描述问题,除了显示数据库的部分和我想要的输出,所以这里。该表有4列:meta_id,post_id,meta_key,meta_value。是的,它来自WP。我需要开始,(我认为)有一个不同的post_id列表,其中meta_key =“location”和meta_value =“washington”。使用该列表,我想返回一个新的“表”或所有其他数据的数组,其中post_id =每个不同的值,meta_key值是一个新的字段名称,其对应的meta_value为其值。我知道这没有多大意义,但是这里是来自我的独特列表中的一个post_id的相关数据 - 这可能会帮助你了解我所追求的内容。我从上面提到的post_id的DISTINCT列表中得到了这个结果的post_id。

meta_id  |  post_id  |  meta_key  |  meta_value
---------|-----------|------------|-------------------
46922    |  5923     |  adlink    | htp://whatever.com
46923    |  5923     |  subloc    | Menu Page
46924    |  5923     |  size      | Premium
46924    |  5923     |  location  | Washington
46924    |  5923     |  image1    | 5924
46924    |  5923     |  image2    | 5925

现在,这是踢球者:我需要用meta_value替换meta_key =“image1”或“image2”的meta_value,其中post_id = meta_value,其中post_id = 5923 AND meta_key =“image1”或“image2”。该数据来自表格的一部分,如下所示:

meta_id  |  post_id  |  meta_key  |  meta_value
---------|-----------|------------|-------------------
46942    |  5924     |  file      | img1.jpg
46923    |  5925     |  file      | img2.jpg

我喜欢的东西会是这样的:

id   |  adlink            |  sublock  |  size   | location   | image1   | image2
-----|--------------------|-----------|---------|------------|----------|---------
5923 | htp://whatever.com | Menu Page | Premium | Washington | img1.jpg | img2.jpg

这有意义吗?这真的让我很伤心 - 对这个复杂查询的任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:1)

哈,使用wordpress我一直这样做。您基本上想要使用多个连接,并使用column_name作为desired_name来设置列名。这是一个使用id 5923的例子:

SELECT meta1.post_id as 'id', 
 meta1.meta_value as 'adlink',
 meta2.meta_value as 'sublock',
 meta3.meta_value as 'size',
 meta4.meta_value as 'location',
 meta5.meta_value as 'image1',
 meta6.meta_value as 'image2' 

FROM wp_postmeta as meta1 

INNER JOIN wp_postmeta as meta2 ON meta1.post_id = meta2.post_id 
INNER JOIN wp_postmeta as meta3 ON meta1.post_id = meta3.post_id 
INNER JOIN wp_postmeta as meta4 ON meta1.post_id = meta4.post_id
INNER JOIN wp_postmeta as meta5 ON meta1.post_id = meta5.post_id
INNER JOIN wp_postmeta as meta6 ON meta1.post_id = meta6.post_id

WHERE 
  meta1.post_id = '5923'  
  AND meta1.meta_key = "adlink"
  AND meta2.meta_key = "sublock"
  AND meta3.meta_key = "size"
  AND meta4.meta_key = "location"
  AND meta5.meta_key = "image1"
  AND meta6.meta_key = "image2" 

这是未经测试但您应该明白这一点。希望它有所帮助

答案 1 :(得分:0)

实现此目的的最快和最有效的查询如下:

$result = mysql_query("SELECT post_id,
       MAX(CASE WHEN meta_key = 'size' THEN meta_value END) size,
       MAX(CASE WHEN meta_key = 'adlink' THEN meta_value END) adlink,
       MAX(CASE WHEN meta_key = 'frontpage' THEN meta_value END) frontpage,
       MAX(CASE WHEN meta_key = 'expiration' THEN meta_value END) expiration,
       MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image1,
       MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image2,
       MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image3,
       MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image4,
       MAX(CASE WHEN meta_key = 'iframe' THEN meta_value END) iframe,
       MAX(CASE WHEN meta_key = 'location' THEN meta_value END) location,
       MAX(CASE WHEN meta_key = 'sublocation' THEN meta_value END) sublocation
       FROM wp_postmeta WHERE post_id IN(SELECT post_id from wp_postmeta WHERE meta_value LIKE '%". $page ."%')
 GROUP BY post_id");