Я новичок в MySQL и пытаюсь написать довольно сложный запрос.Но эй!Обучение с помощью & Stackoverflow!
Возможно, я смогу получить все данные в менее сложном запросе / запросах и отсортировать данные с помощью PHP.Но я полагаю, что это можно сделать непосредственно в запросе.
Ниже приведен мой код.Пожалуйста, задайте вопрос, если вы не понимаете, и я постараюсь объяснить лучше.И, пожалуйста, помогите мне исправить код, если вы обнаружите какие-либо ошибки.
Код будет использоваться для отображения различных полей на моих страницах WordPress.Различные файлы будут иметь разные категории, например.боковая панель-блог, боковая панель-страница, выделение-блог, выделение-страница.Это будет работать почти как обычные сообщения.
Вот структура базы данных 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>';
?>
Новая версия, новый вопрос:
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
)
"#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
Если невозможно найти или исключить meta_key для исключить или указать исключение для post_id Iхочу вернуть данные ...
Пример senario, когда я хочу вернуть данные:
meta_id post_id meta_key meta_value
2 30 _edit_lock 1322225789:1
3 30 _edit_last 1
Есть идеи, как мне это решить?Оператор, который говорит: Если для текущего идентификатора не найдено ни одной строки с исключением или включением.Верните данные.
Дополнительные примеры:
Значение 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
Тогда я хочу получить wp_posts.post_content, wp_posts.ID и wp_terms.slug AS LONG AS $ id IS 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
Тогда я хочу получить обратно wp_posts.post_content, wp_posts.IDи wp_terms.slug AS LONG AS $ id НЕ 18.
Если senario:
meta_id post_id meta_key meta_value
2 30 _edit_lock 1322225789:1
3 30 _edit_last 1
Тогда я хочу получить обратно wp_posts.post_content, wp_posts.ID и wp_terms.slug.