我正在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”的所有电视节目,然后根据季节对剧集进行排序。我认为这会很简单,但我所尝试的一切都没有回报。
请问您能解释我怎么做?
答案 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