简体   繁体   中英

SQL join table result of 2 statements

I am trying to get data with SQL from my Wordpress database by a JOIN, but I do not get it working.

What I need:

  • Posts where the meta_key "gtp_product_dont_show" exists and where the meta_value not is "true".
  • And posts where the meta_key "gtp_product_dont_show" does not exists.

My Problem:

I now only get the results where posts have a meta_key "gtp_product_dont_show", but there are also posts which don't have this key, and I need these as well.

This is what I have now:

SELECT 
    ID, post_title
FROM 
    wp_posts p
    JOIN wp_postmeta m ON 
        p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' AND 
        m.meta_value != 'true'
WHERE 
    post_type = 'products' AND 
    post_status = 'publish'

Output:

You need a left join :

SELECT ID, post_title
FROM wp_posts p LEFT JOIN
     wp_postmeta m
     ON p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' 
WHERE (m.meta_value is null or m.meta_value <> 'true') and
      post_type = 'products' AND 
      post_status = 'publish';

The left join looks for an appropriate key in the wp_postmeta table. The where clause then says "keep a record when there is no match or the value is not true" -- which I think is the logic you are looking for.

You're looking for this?

SELECT 
    ID, post_title
FROM 
    wp_posts p
WHERE 
    post_type = 'products' AND 
    post_status = 'publish' AND
    not exists (
        select 1 
        from wp_postmeta m
        where 
        p.ID = m.post_id AND 
        m.meta_key = 'gtp_product_dont_show' AND 
        m.meta_value = 'true')

This will fetch all the rows from wp_posts, but leave out those where row is found from wp_postmeta where meta_key is gtp_product_dont_show and value is true.

You can use the OR operator to consider both conditions. Try this:

SELECT stuff
FROM myTable
JOIN otherTable ON 
   (m.meta_key = 'gtp_product_dont_show' AND m.meta_value != 'true') OR 
   (m.meta_key != 'gtp_product_dont_show')
...

Just a side note, I don't recommend storing booleans as strings like that. You should consider using a TINYINT() where boolean fields are stored as 0 for false, or 1 for true.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM