MYSQL оператор INNER JOIN с несколькими условиями - PullRequest
1 голос
/ 10 ноября 2010

У меня есть сайт WP, на котором у меня также есть несколько php-страниц вне моей установки WP, которые мне нужны для запроса базы данных, которая поддерживает мой сайт WP.У меня есть рабочий запрос, но он не показывает, что мне действительно нужно для вывода.

Это две таблицы wp_posts и wp_postmeta

wp_posts
ID
post_author
post_date
post_date_gmt
post_content
post_title
post_excerpt
post_status
comment_status
pint_status
post_password
post_name
to_ping
pinged
post_modified
post_modified_gmt
post_content_filtered
post_parent
guid
menu_order
post_type
post_mine_type
comment_count

wp_postmeta
meta_id
post_id
meta_key
meta_value

, и это запрос, который показывает публикацию публикации:

$query = "SELECT post_title, post_name FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 5";

и это запрос, который отображается с meta_key = '_wp_attached_file'

$query ="SELECT post.ID, post.post_title, post.post_excerpt, post.post_content, meta.meta_value FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON meta.post_id = post.id AND meta.meta_key = '_wp_attached_file' ";

, что я хочу, чтобы объединить эти два запроса, чтобы показать post_status = 'publish' иmeta_key = '_wp_attached_file'

вот пример моего запроса, но он не показывает значение

<?php
   $query ="SELECT post.ID, post.post_title, post.post_excerpt, post.post_content, meta.meta_value FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON meta.post_id = post.id AND meta.meta_key = '_wp_attached_file' WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 5 ";

    $result = mysql_query($query,$link);
        if(mysql_num_rows($result)) {
          while($post = mysql_fetch_object($result)) {
               echo "$post->meta_value";  
               echo "$post->post_title";
               echo "$post->post_content";
        }
        }
?>

большое спасибо, ребята ...

другая проблема, которую он показываеттолько 1 пост и не последний пост

вот мой обновленный код

<?php
$con = mysql_connect("localhost", "root", "");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

$db_selected = mysql_select_db("wp_db",$con);
$sql = "SELECT 
  posts.ID,
  posts.post_title AS title,
  posts.post_content AS content,
  files.meta_value AS filepath
FROM
  wp_posts posts
  INNER JOIN wp_posts attachments ON posts.ID = attachments.post_parent
  INNER JOIN wp_postmeta files ON attachments.ID = files.post_id
WHERE 1 = 1
  AND files.meta_key = '_wp_attached_file'";
$result = mysql_query($sql,$con);

while ($row = mysql_fetch_object($result))
  {
  echo $row->title . "<br />";
  }

mysql_close($con);
?>

могу ли я что-то не так с моим кодом .... спасибо за помощь большое спасибо ...

Ответы [ 3 ]

2 голосов
/ 10 ноября 2010

Привет @ idontknowhow :

Ваша проблема, кажется, неверные предположения относительно схемы базы данных WordPress.WordPress хранит свои вложения как post_type='attachment'.Запустите этот запрос, чтобы понять, что я имею в виду:

SELECT 
  wp_posts.ID,
  wp_posts.post_type
FROM
  wp_posts
  INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE 1 = 1
  AND wp_postmeta.meta_key = '_wp_attached_file'

Записи в wp_posts с post_type='attachment' обычно имеют 'post_status='inherit' и 'post_parent', равные значению поля ID вашего сообщения.

Теперь я не совсем понял, чего вы хотели достичь.Вы упомянули технические проблемы, которые у вас были, но не фактический результат, которого вы пытались достичь.Не зная последнего, мне трудно убедиться, что я понял ваш вопрос.Так что, возможно, я неправильно понял, что вы искали, но я думаю, что это то, что вы хотели:

SELECT 
  posts.ID,
  posts.post_title AS title,
  posts.post_content AS content,
  files.meta_value AS filepath
FROM
  wp_posts posts
  INNER JOIN wp_posts attachments ON posts.ID = attachments.post_parent
  INNER JOIN wp_postmeta files ON attachments.ID = files.post_id
WHERE 1 = 1
  AND files.meta_key = '_wp_attached_file'

Но использование прямого SQL не одобряется в мире WordPress;Вместо этого использование WordPress API является предпочтительным выбором, если он обеспечивает то, что вам нужно.Существует много причин для этого;то есть, чтобы избежать поломок, если будущие версии WordPress изменят схему базы данных и поскольку WordPress выполняет много операций кэширования данных, поэтому в повседневном использовании может быть более производительным не использовать прямой SQL и вместо этого использовать API WordPress.

ОднакоИспользование WordPress API для решения вашего вопроса не на 100% прямолинейно, хотя это можно сделать.Если вы хотите посмотреть, как я могу предложить спросить на родственном сайте StackOverflow Ответы на WordPress , где могут помочь многие энтузиасты WordPress?

Надеюсь, это поможет.Майк

PS Я нахожу, что многие вопросы о запросах к базе данных WordPress здесь, в StackOverflow, заставляют людей пытаться ответить на них, даже если они не знают схемы базы данных WordPress и, что более важно, не знают API WordPress,Люди здесь очень хорошо знают MySQL, но часто недостаточно хорошо знают WordPress, чтобы дать правильный ответ на вопросы, связанные с WordPress. Ответы WordPress , вероятно, лучшее место, чтобы задавать вопросы о WordPress.

0 голосов
/ 10 ноября 2010

Вы пытались отфильтровать mete.meta_key на WHERE? Примерно так:

SELECT post.ID, post.post_title, post.post_excerpt,
    post.post_content, meta.meta_value
FROM wp_posts AS post
    INNER JOIN wp_postmeta AS meta ON meta.post_id = post.id
WHERE meta.meta_key = '_wp_attached_file'
    AND post.post_type = 'post'
    AND post.post_status = 'publish'
ORDER BY post.post_date DESC
LIMIT 5;
0 голосов
/ 10 ноября 2010

Ваш запрос выглядит правильно.

Вы уверены, что опубликовали сообщения с _wp_attached_file?

Есть ли в результатах ваших запросов какие-либо общие записи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...