连接两个表,每次选择不同的行

时间:2018-01-17 08:22:27

标签: mysql wordpress join

我必须两次加入wp_posts和wp_postsmeta来获取行。首先是post_type=product,然后是post_type=attachment

wp_posts:

╔════╦════════════╦═════════════════════════════════════════════════════╗
║ ID ║ post_type  ║ guid                                                ║
╠════╬════════════╬═════════════════════════════════════════════════════╣
║ 48 ║ product    ║ http://example.com/xyz                              ║
╚════╩════════════╩═════════════════════════════════════════════════════╝

wp_postsmeta

╔═════════╦═════════╦═══════════════╦═══════════╗
║ meta_id ║ post_id ║ meta_key      ║ meta_value║
╠═════════╬═════════╬═══════════════╬═══════════╣
║ 200     ║ 48      ║ _price        ║ 100       ║
╚═════════╩═════════╩═══════════════╩═══════════╝

查询:

接下来,我还想再次wp_postswp_postsmetapost_type = attachment以及meta_key =_thumbnail加入╔════╦════════════╦═════════════════════════════════════════════════════╗ ║ ID ║ post_type ║ guid ║ ╠════╬════════════╬═════════════════════════════════════════════════════╣ ║ 150║ attachment ║ http://example.com/xyz.png ║ ╚════╩════════════╩═════════════════════════════════════════════════════╝

╔═════════╦═════════╦═══════════════╦═══════════╗
║ meta_id ║ post_id ║ meta_key      ║ meta_value║
╠═════════╬═════════╬═══════════════╬═══════════╣
║ 200     ║ 48      ║ _thumbnail    ║ 150       ║
╚═════════╩═════════╩═══════════════╩═══════════╝

wp_postsmeta:

SELECT p1.ID, p1.guid, p3.guid
FROM wp_posts p1 
     JOIN wp_postmeta p2
     ON p1.ID = p2.post_id AND
        p2.meta_key = '_price' AND
        p1.post_type = 'product' AND
        p1.post_status = 'publish' 
     JOIN wp_posts p3
     ON p3.ID = p2.post_id AND 
        p2.meta_key = '_thumbnail_id' 
     JOIN wp_postmeta p4
     ON p4.post_id = p3.ID AND
        p3.post_type = 'attachment';

然后我使用结果的meta_value并再次使用wp_posts(主键wp_posts.id = wp_postsmeta.meta_value)将其连接起来,这样我就可以从中获得产品的特色图像。

以下是我的完整查询

╔════╦════════════╦═════════════════════════╦════════════════════════════╗
║ ID ║ post_type  ║ guid                    ║  guid                      ║
╠════╬════════════╬═════════════════════════╬════════════════════════════╣
║ 48 ║ product    ║ http://example.com/xyz  ║ http://example.com/xyz.png ║
╚════╩════════════╩═════════════════════════╩════════════════════════════╝

上面的查询返回空结果(它不应为空,但如下所示返回表)

set processImage(event) {
    console.log(event);
    let files: FileList = event.target.files;
    let file = files[0]; 
    //send the file as a binary via httpClient
    ....

1 个答案:

答案 0 :(得分:0)

尝试此查询

SELECT posts.post_title,posts.ID, posts.post_name, (SELECT guid from wp_posts AS thumbnailpost INNER JOIN `wp_postmeta` ON (`wp_postmeta`.meta_value = thumbnailpost.ID) where `wp_postmeta`.meta_key='_thumbnail_id' AND `wp_postmeta`.post_id = 2856) AS thumbnail FROM `wp_posts` AS posts where posts.post_type = 'product' and posts.post_status='publish' group by posts.ID limit 100

<强>更新

你想这样吗?

SELECT p1.ID, p1.guid,
(select p.guid from wp_posts as p where p2.meta_value=p.ID and post_type='attachment') img
FROM wp_posts p1 
     JOIN wp_postmeta p2
     ON p1.ID = p2.post_id AND       
        p1.post_type = 'product' AND
        p1.post_status = 'publish' AND
         p2.meta_key = '_thumbnail_id' 
     JOIN wp_posts p3
     ON p3.ID = p2.post_id