Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tablice zapytań meta WordPress

Wypróbuj ten z WP_Query nie ma potrzeby relacji po prostu użyj części porównania z IN

 $user_ids = array(60, 61, 62, 63);
 $args = array(
   'post_type' => 'post',
   'meta_key' => 'likes',
   'post_status'       => 'publish',
   'posts_per_page'    => -1,
   'orderby'           => 'rand',       
   'order' => 'ASC',
   'meta_query' => array(
       array(
           'key' => 'likes',
           'value' => $user_ids, //array
           'compare' => 'IN',
       )
   )
 );
 $query = new WP_Query($args);

LUB przez get_posts spróbuj tego

$args = array(
    'post_type'         => 'post',
    'post_status'       => 'publish',
    'posts_per_page'    => -1,
    'orderby'           => 'rand',
    'meta_query'        => array(

        array(
            'key'       => 'likes',
            'value'     => $user_ids,
            'compare'   => 'IN'
        )
    )
);
$posts = get_posts($args);

LUB za pomocą niestandardowego zapytania możesz wykonać następujące czynności

global $wpdb;

$liked_posts=$wpdb->get_results("SELECT * FROM `wp_posts` WHERE 
post_type='post' AND post_status ='publish' AND ID
 IN(
SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' 
AND meta_value IN (".join(',',$user_ids).")
) ORDER BY RAND()");

Nie przechowuj również tablicy identyfikatorów w jednym wierszu, zamiast tego przejdź przez tablicę identyfikatorów i normalizuj Twoje polubienia danych ręcznie Nie serializuj danych do pola bazy danych. To właśnie Database_normalization jest dla i wstawia każdy identyfikator w nowym wierszu, ponieważ

$likes = array(61, 62);

foerach($likes as $l){

update_post_meta($post->ID, "likes", $l);

}

A poniżej znajduje się zapytanie, o które prosiłeś w komentarzach do nagród

$liked_posts=$wpdb->get_results("
SELECT * FROM `wp_posts` wp
INNER JOIN `wp_term_relationships` wtr ON (wp.`ID`=wtr.`object_id`)
INNER JOIN  `wp_term_taxonomy` wtt ON (wtr.`term_taxonomy_id` =wtt.`term_taxonomy_id`)
WHERE  wp.post_type='post' AND wp.post_status ='publish' AND wp.ID
 IN(
SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' 
AND meta_value IN (".join(',',$user_ids).")
)  AND wp.ID NOT IN (100,101,102)
AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,)    
ORDER BY RAND() ");

Użyłem INNER JOINs na wp_term_relationships i wp_term_taxonomy tabela wp_term_relationships przechowuje relację postów i taksonomię kategorii oraz tabelę wp_term_taxonomy mają taksonomię kategorii, a także identyfikator kategorii

Oto część, która obejmuje

1. kategoria (uwzględnij i wyklucz)

AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,) 

2. ignoruj ​​posty według tablicy identyfikatorów

AND wp.ID NOT IN (100,101,102) 
or $postids =array(100,101,102);
AND wp.ID NOT IN (".join(',',$postids).")


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj posty WP oparte na wielu parach meta klucz/wartość za pomocą IN

  2. Ostrzeżenie:#1265 Dane zostały obcięte dla kolumny „pdd” w wierszu 1

  3. LocalDateTime , ZonedDateTime i znacznik czasu

  4. MySQL vs MongoDB 1000 odczytów

  5. PHP - łączenie się z bazą danych mysql z innego serwera