复杂的MySQL查询

时间:2009-11-06 21:56:26

标签: php mysql wordpress

我正在wordpress中创建一个网站,其中包含有关电视节目的信息。我正在使用自定义字段来选择每个帖子。

表格看起来像这样

+----+---------+----------+------------+
| id | post_id | meta_key | meta_value |
+----+---------+----------+------------+
| 1  |    1    |   name   | Smallville |
| 2  |    1    |  season  |     1      |
| 3  |    1    |  episode |     1      |
| 4  |    2    |   name   | Smallville |
| 5  |    2    |  season  |     1      |
| 6  |    2    |  episode |     2      |
+----+---------+----------+------------+

基本上我需要做的是选择名为“Smallville”的所有电视节目,然后根据季节对剧集进行排序。我认为这会很简单,但我所尝试的一切都没有回报。

请问您能解释我怎么做?

5 个答案:

答案 0 :(得分:11)

您可以这样做:

SELECT 
    t1.post_id, 
    t1.meta_value AS name, 
    t2.meta_value AS season, 
    t3.meta_value AS episode
FROM
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'name'
    ) t1
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'season'
    ) t2 ON t1.post_id = t2.post_id
INNER JOIN
    (
    SELECT *
    FROM the_table
    WHERE meta_key = 'episode'
    ) t3 ON t1.post_id = t3.post_id

这会给你结果:

| post_id | name       | season | episode |
-------------------------------------------
|    1    | Smallville | 1      | 1       |
|    2    | Smallville | 1      | 2       |

在这种形式下,任何操作都更容易。

您需要添加:

WHERE name = 'Smallville'
ORDER BY season, episode

答案 1 :(得分:7)

使用自联接合并行,您可以去:

SELECT      *
FROM        yourtable name
INNER JOIN  yourtable season 
            on season.post_id = name.post_id
            and season.meta_key = 'season'
INNER JOIN  yourtable episode
            on episode.post_id = name.post_id
            and episode.meta_key = 'episode'
WHERE       name.meta_key = 'name'
            and name.meta_value = 'Smallville'
ORDER BY    season.meta_value, episode.meta_value

答案 2 :(得分:2)

更一般的情况:从格式转换为更正常的关系数据库格式:

SELECT (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "season") AS season,
   (SELECT meta_value FROM data t1 WHERE t1.post_id = t0.post_id AND meta_key = "episode") AS episode
FROM data t0 WHERE meta_key = "name" AND meta_value = "Smallville"

对于实际排序,您无法重复使用季节/剧集值(排序时尚未分配),因此您必须将子查询复制/粘贴到ORDER BY子句中:

ORDER BY (SELECT ... "season") ASC, (SELECT ... "episode") ASC, 

答案 3 :(得分:2)

无需直接SQL。 您可以通过WP_Query对象访问SQL查询。查看WP_Query对象中where子句周围的过滤器(有多种方法可以实现)并简单地修改默认的WP_Query部分,然后将它们连接在一起。

首先设置一个WP_Query对象,该对象通过postmeta key&获取所有帖子。 postmeta值,然后在where子句中添加一些额外的条件。

还有另一个过滤器,允许您获取SQL查询的排序部分,以便您可以修改它。

没有理由在这里手写SQL,只需修改已经为你构建的内容。

答案 4 :(得分:1)

这个想法是将表连接到自身3次,其中每个表都为给定的meta_key获取行:

SELECT t1.meta_value name, t2.meta_value season, t3.meta_value episode
FROM table t1
JOIN table t2 on t1.post_id = t2.post_id and t2.meta_key = 'season'
JOIN table t3 on t1.post_id = t3.post_id and t3.meta_key = 'episode'
WHERE t1.meta_key = 'name'
  AND t1.meta_value = 'Smallville'
ORDER BY t2.meta_value, t3.meta_value