使用JOIN在Wordpress中进行高级MySQL查询

Hak*_*kan 3 mysql sql wordpress join

我是MySQL的新手,我正在尝试编写一个非常高级的查询.但是嘿!边做边学和Stackoverflow学习!

我可能会在不太高级的查询/查询中获取所有数据,并使用PHP对数据进行排序.但我认为它可以直接在查询中完成.

以下是我的代码.如果您不理解,请询问问题,我会尝试更好地解释.如果您发现任何错误,请帮我纠正代码.

该代码将用于在我的wordpress页面上显示不同的字段.不同的fildes将有不同的类别,例如.sidebar-blog,sidebar-page,highlight-blog,highlight-page.它几乎像常规帖子一样工作.

这是Wordpress的数据库结构:

问题:

我如何加入表:wp_posts,wp_term_relationships,wp_term_taxonomy,wp_terms和wp_postmeta?

进行高级查询或使用PHP来处理if/else函数是一种好习惯吗?

<?php

$id = $post->ID; // Gets the ID of current page

$query = "
SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug        # Data from two different tables

FROM wp_posts

# Cant figure out how to join the tables
INNER JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id

INNER JOIN wp_term_relationships
ON wp_posts.ID = wp_term_relationships.object_id

INNER JOIN wp_term_taxonomy
ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id

INNER JOIN wp_terms
ON wp_term_taxonomy.term_id = wp_terms.term_id




WHERE
wp_posts.post_type = 'my-own-post-type'         # Only get specific post-type
AND
wp_posts.post_status = 'publish'                # Only get published posts


AND

# START - Only get categories specified here
(
wp_terms.slug = 'category-1'
OR
wp_terms.slug = 'category-2'
OR
wp_terms.slug = 'category-3'
OR
wp_terms.slug = 'category-4'
OR
wp_terms.slug = 'category-5'
)
# END - Only get categories specified here


AND

# I want to be able to include or exclude specific pages, even if category is the right one
# Exlude = Don't get data if current page ID is found (ID of current page will be checked in meta_value using %,$id,%)
# Include means: If include value is specifyed, then get data ONLY if ID is found (ID of current page will be checked in meta_value using %,$id,%)
# If not exclude and include are set, it should get the data

# START - Include exclude
(
# exclude is set, so check if page id match anywhere. If it IS found it it should not get the data, otherwise YES
wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value <> '%,$id,%'
OR
# include is set, so check if page id match anywhere. If it IS NOT found it it should not get the data, otherwise YES
wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '%,$id,%'
OR
# If exclude and include aren't set it should get the data
wp_postmeta.meta_key <> 'exkludera' AND wp_postmeta.meta_key <> 'include'
)
# END - Include exclude


";



$result = mysql_query($query);

while($row = mysql_fetch_array($result))
{

// collect all fields in category 1 (eg. sidebar)
if($row['slug'] == 'category-1'){
$all_fields_from_category_1 = $all_fields_from_category_1.'
<div id="field-sidebar">
'.$row['post_content'].'
</div>
';}

// collect all fields in category 1 (eg. highlight)
if($row['slug'] == 'category-2'){
$all_fields_from_category_2 = $all_fields_from_category_2.'
<div id="field-highlight">
'.$row['post_content'].'
</div>
';}



} // end while



// sidebar
echo '<div id="container-sidebar">'.
$all_fields_from_category_1.
'</div>';


// highlight
echo '<div id="container-highlight">'.
$all_fields_from_category_1.
'</div>';

?>
Run Code Online (Sandbox Code Playgroud)

新版本,新问题:

SELECT DISTINCT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'my-own-fields'

AND wp_posts.post_status = 'publish'
AND wp_terms.slug IN
('field1', 'field2', 'field3', 'field4', 'field5', 'field6')
AND
(
wp_postmeta.meta_key = 'exlude' AND wp_postmeta.meta_value <> '$id'
OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '$id'
OR wp_postmeta.meta_key <> 'exlude' AND wp_postmeta.meta_value <> 'include' #LAST ROW
)
Run Code Online (Sandbox Code Playgroud)

即使设置了exclude或include,"#LAST ROW"也会返回数据.因为它与表wp_postmeta中的另外两行匹配.

表wp_postmeta的示例:

meta_id     post_id     meta_key    meta_value
1           30          include     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1
Run Code Online (Sandbox Code Playgroud)

如果找不到meta_key的inklude或exclude for post_id,我想返回数据...

我想要返回数据时的示例:

meta_id     post_id     meta_key    meta_value
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1
Run Code Online (Sandbox Code Playgroud)

知道怎么解决这个问题吗?声明如下:如果没有找到包含exclude或include的行用于当前id.返回数据.

更多例子:

post_id是30.

如果senario是:

meta_id     post_id     meta_key    meta_value
1           30          include     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1
Run Code Online (Sandbox Code Playgroud)

然后我想回到wp_posts.post_content,wp_posts.ID和wp_terms.slug,因为$ id是18.

如果senario是:

meta_id     post_id     meta_key    meta_value
1           30          exclude     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1
Run Code Online (Sandbox Code Playgroud)

然后我想回到wp_posts.post_content,wp_posts.ID和wp_terms.slug,因为$ id不是18.

如果senario是:

meta_id     post_id     meta_key    meta_value
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1
Run Code Online (Sandbox Code Playgroud)

然后我想回到wp_posts.post_content,wp_posts.ID和wp_terms.slug.

Ada*_*ger 6

你的联接正确完成.删除你的评论和额外的行时,你会发现查询并不是那么复杂.我做的唯一真正的改变是将wp_terms.slug的OR列表更改为IN语句.这样做只是为了减少代码重复,清理外观,而不是改变功能.

SELECT p.post_content, p.ID, t.slug
FROM wp_posts AS p
INNER JOIN wp_postmeta AS pm ON p.ID = pm.post_id
INNER JOIN wp_term_relationships AS tr ON p.ID = tr.object_id
INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN wp_terms AS t ON tt.term_id = t.term_id
WHERE p.post_type = 'my-own-post-type'
   AND p.post_status = 'publish'
   AND t.slug IN
      ('category-1', 'category-2', 'category-3', 'category-4', 'category-5')
   AND
   (
      ( pm.meta_key = 'exclude' AND pm.meta_value <> '$id' )
         OR ( pm.meta_key = 'include' AND pm.meta_value = '$id' )
         OR ( pm.meta_key <> 'exclude' AND pm.meta_value <> 'include' )
   )
Run Code Online (Sandbox Code Playgroud)