MySQL left join needed on Wordpress database - mysql

I'm new to MySQL and ended up with this statement on a standard Wordpress database to get the latest articles.
However, the statement below requires that related rows are found in [wp_postmeta] to get the thumbnail belonging to the article.
However, some posts may not have a thumbnail but I still want to select those.
How can I alter the statement to not require a thumbnail value in [wp_postmeta]? I believe I need a left join clause, but don't know how to do it.
SELECT p.*, ( SELECT guid FROM wp_posts WHERE id = m.meta_value ) AS imgurl
FROM wp_posts p, wp_postmeta m
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.id = m.post_id
AND m.meta_key = '_thumbnail_id'
ORDER BY post_date DESC

Try this with join and ON(p.id = m.post_id AND m.meta_key = '_thumbnail_id' )
SELECT DISTINCT p.*, ( SELECT guid FROM wp_posts WHERE id = m.meta_value LIMIT 1) AS imgurl
FROM wp_posts p
LEFT JOIN wp_postmeta m ON(p.id = m.post_id AND m.meta_key = '_thumbnail_id' )
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
ORDER BY post_date DESC

Use this query it will fetch latest 5 post, you can increase the display limit.
$sql = " SELECT * FROM wp_posts p
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_type = 'post'
ORDER BY p.post_date DESC
LIMIT 5";

Related

Querying WordPress DB from normal sql

Disclaimer: I am not going to use any other ways I have a specific requirement.
All I want is to Join from posts table to the posts meta so that I can get the featured image per post. I am able to get the post via where clause post type is post and published but I don't know how to write join for MySql to get the featured image of each post
You may try something like this:
$sql = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
ORDER BY $wpdb->posts.post_date DESC
";
// Get an array of objects
$posts = $wpdb->get_results($sql, OBJECT);
You may check more here.
If someone else is still looking for the sql needed here you go
SET #term = "someterm"
SELECT DISTINCT
posts.id,
posts.post_author,
posts.post_title,
posts.post_date,
LEFT(posts.post_content,300) post_content,
wpmeta.meta_value thumbnail
FROM wp_posts posts
INNER JOIN wp_postmeta wpm ON posts.id = wpm.post_id
INNER JOIN wp_postmeta wpmeta ON wpm.meta_value = wpmeta.post_id
LEFT JOIN wp_term_relationships rel ON rel.object_id = posts.ID
LEFT JOIN wp_term_taxonomy tax ON tax.term_taxonomy_id = rel.term_taxonomy_id
LEFT JOIN wp_terms t ON t.term_id = tax.term_id
WHERE
post_status = 'publish'
AND posts.post_type = 'post'
AND wpm.meta_key = '_thumbnail_id'
AND wpmeta.meta_key = '_wp_attached_file'
AND 1 =
CASE
WHEN #term IS NULL THEN 1
WHEN #term IS NOT NULL AND t.term_id = #term THEN 1
ELSE 0
END
ORDER BY post_date DESC

SELECT WHERE value > value2 (value2 retrieved from another row in postmeta table)

I am working on Wordpress, I want to get
ID in 'posts' table where posts.ID = postmeta.post_id AND postmeta.distance > postmeta.radius
And now the SQL statement:
SELECT DISTINCT p.ID
FROM posts p
LEFT JOIN postmeta m ON p.ID = m.post_id
WHERE p.post_type = 'babysitter'
AND p.post_status = 'publish'
AND m.meta_key = 'distance'
AND ( m.meta_value > (SELECT meta_value
FROM postmeta
WHERE meta_key = 'radius' ))
Besides the problem of avoiding nested SELECT I don't get what I want
Well, you explanation seems weird.. You say postmeta.distance > postmeta.radius but you select it from hlp_postmeta , also M alias seem not to do anything. So, I'm guessing you have a few typos here, Either you want it from postmeta like you said, and then I think this is what you need:
SELECT DISTINCT p.ID
FROM posts p
LEFT JOIN postmeta m ON p.ID = m.post_id
LEFT JOIN postmeta m2 ON p.ID = m2.post_id
WHERE p.post_type = 'babysitter'
AND p.post_status = 'publish'
AND m2.meta_key = 'distance'
AND m.meta_key = 'radius'
AND m2.meta_value > m.meta_value
Or you its not like you said and its from hlp_postmeta and then:
SELECT DISTINCT p.ID
FROM posts p
LEFT JOIN postmeta m ON p.ID = m.post_id
LEFT JOIN hlp_postmeta m2 ON p.ID = m2.post_id
WHERE p.post_type = 'babysitter'
AND p.post_status = 'publish'
AND m2.meta_key = 'distance'
AND m.meta_key = 'radius'
AND m2.meta_value > m.meta_value
Of course I can be wrong in both cases, if so tell me and I'll correct it.

Wordpress SQL with category addition

I have some SQL in a plugin that selects Wordpress users based on what posts they have made. The issue I have is also requiring that posts are from a certain category. I have looked at the terms table but I am not getting any further.
Here is the SQL code I have to far.
SELECT u.ID, u.user_nicename, u.display_name, u.user_email, p.post_date
FROM $wpdb->users u
INNER JOIN (SELECT post_author, MAX(post_date) post_date
FROM $wpdb->posts
WHERE post_type = 'post' AND post_title != 'Auto Draft' AND post_title != '' AND post_status = 'publish'
GROUP BY post_author) p
WHERE u.ID = p.post_author
ORDER BY u.display_name
I think I want to add something like the below to the query but I'm not sure.
AND $wpdb->term_taxonomy.taxonomy = 'category'
Try this:
SELECT u.ID, u.user_nicename, u.display_name, u.user_email, p.post_date, p.ID, ktt.taxonomy, kct.Name
FROM kc_users u
INNER JOIN (SELECT post_author, MAX(post_date) post_date, ID
FROM kc_posts
WHERE post_type = 'post' AND post_title != 'Auto Draft' AND post_title != '' AND post_status = 'publish'
GROUP BY post_author) p
INNER JOIN kc_term_relationships ktr ON ktr.object_id = p.ID
INNER JOIN kc_term_taxonomy ktt ON ktt.term_id = ktr.term_taxonomy_id
INNER JOIN kc_terms kct ON kct.term_id = ktt.term_id
WHERE u.ID = p.post_author
AND ktt.taxonomy = 'category'
-- AND kct.Name = 'your description filter' <- Filter here
ORDER BY u.display_name
Obviously your prefix for your table names will be different than mine

Custom SQL query to get most viewed posts with images

I am trying to write a custom SQL query and can only get part of it working.
I need to select the top 10 posts with the most amount of views. (See code below)
SELECT p.*, pm1.meta_value + 0 AS viewcount
FROM wp_posts p
LEFT JOIN wp_postmeta pm1 ON pm1.post_id = p.ID
WHERE pm1.meta_key = 'pvc_views' AND p.post_status IN ('publish') AND p.post_type='post' AND p.post_password =''
ORDER BY viewcount
DESC LIMIT 0, 10
The code above does work but I also need to add something to the query that also returns the image attachment metadata. I tried the code below which includes an inner join but I get the error: Unknown column 'ID' in 'where clause'
SELECT p.*, pm1.meta_value + 0 AS viewcount
FROM wp_posts p
INNER JOIN (SELECT * FROM wp_postmeta WHERE post_id = ID AND meta_key = '_wp_attachment_metadata') pm2
LEFT JOIN wp_postmeta pm1 ON pm1.post_id = p.ID
WHERE pm1.meta_key = 'pvc_views' AND p.post_status IN ('publish') AND p.post_type='post' AND p.post_password =''
ORDER BY viewcount
DESC LIMIT 0, 10
Can anyone help?
You need to provide the alias of wp_posts's table in the inner query also you can rewrite your query as below
SELECT
p.*,
pm1.meta_value + 0 AS viewcount ,
pm2.meta_value AS image
FROM wp_posts p
INNER JOIN
wp_postmeta pm2
ON (pm2.post_id = p.ID AND pm2.meta_key = '_wp_attachment_metadata')
LEFT JOIN wp_postmeta pm1 ON pm1.post_id = p.ID
WHERE
pm1.meta_key = 'pvc_views'
AND p.post_status IN ('publish')
AND p.post_type='post'
AND p.post_password =''
ORDER BY viewcount
DESC LIMIT 0, 10

How to merge two SQL queries to get latest Wordpress Post and Featured Image

I'm trying to show latest Post Excerpt, Post Title and Featured Image on an ASP page. To simplify the query I add the Permalink as a custom field for each Post. I have a query that gets all except Featured Image and I have another query that gets Featured image but I can't work out how to merge them into one query.
// Gets Post Excerpt and Post Title
SELECT
wp_posts.id,
wp_posts.post_title,
wp_postmeta.meta_value,
wp_postmeta.meta_key,
wp_posts.post_excerpt
FROM
wp_postmeta
INNER JOIN wp_posts p ON (wp_postmeta.post_id = wp_posts.ID)
WHERE post_id IN (
SELECT wp_posts.id
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
AND meta_key = 'my_permalink'
ORDER BY post_date, wp_posts.id
)
ORDER BY wp_posts.post_date DESC, wp_postmeta.post_id
LIMIT 2
// Gets Featured Images for a Post
SELECT p.*
FROM wp_postmeta AS pm
INNER JOIN wp_posts AS p ON pm.meta_value=p.ID
WHERE pm.post_id = $ID
AND pm.meta_key = '_thumbnail_id'
ORDER BY p.post_date DESC
Can anyone help me merge these queries? Thanks.
Sample data to be returned:
ID | post_title | post_excerpt | meta_value_my_permalink | featured_image_guid
** UPDATE *
I've managed to get the following which works fine except I can't get more that one row as I get an error when I try and use 'IN' in a subquery
e.g. pm2.post_id IN (SELECT wp_posts.id FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 2)
SELECT
p.post_title,
p.post_excerpt,
pm.meta_value AS permalink,
p2.guid as thumbnail,
p2.post_title as image_alt
FROM
wp_postmeta pm
INNER JOIN wp_posts p ON (pm.post_id = p.ID),
wp_postmeta pm2
INNER JOIN wp_posts p2 ON (pm2.meta_value = p2.ID)
WHERE
pm.post_id = (SELECT wp_posts.id FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1) AND
pm.meta_key = 'my_permalink' AND
pm2.post_id = (SELECT wp_posts.id FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1) AND
pm2.meta_key = '_thumbnail_id'
It is difficult to see what you are trying to get without some sample data but I think that you know the post ID and need the info from both the my_permakink and _thumbnail_id keys?
Since I'm on a tablet I will give you the bare bones only and let you limit the result set and filter it.
Select *
From wp_posts p
Inner join
Wp_postmeta pm1 on p.id = pm1.post_id and metakey = 'my_permalink'
Inner join
Wp_postmeta pm2 on p.id = pm1.post_id and metakey = '_thumbnail_id'
This will give you every post that has an image with the info for both metakeys. If you want the info for posts without an image change the second inner join to a left join.
A bunch of joins and a view as the subquery has given me what I need.
SELECT
p.post_title,
p.post_excerpt,
pm.meta_value AS permalink,
p2.guid AS thumbnail,
p2.post_title AS thumbnail_alt
FROM
wp_postmeta pm
INNER JOIN wp_posts p ON (pm.post_id = p.ID)
INNER JOIN wp_postmeta pm2 ON (pm2.post_id = p.ID)
INNER JOIN wp_posts p2 ON (pm2.meta_value = p2.ID)
WHERE
pm.meta_key = 'my_permalink' AND
pm2.meta_key = '_thumbnail_id' AND
p.ID IN (SELECT * FROM vwLatestPostIds)
Use this to retrieve the post title, post id, post featured thumbnail url, post category etc -
"SELECT a.ID id, a.post_title title, a.post_content content,taxonomy, name, a.post_date_gmt postdate,max(c.guid) img_url
FROM kb_posts a
JOIN kb_term_relationships tr
ON (a.id = tr.object_id)
JOIN kb_term_taxonomy tt
ON (tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy='category')
JOIN kb_terms t
ON (t.term_id = tt.term_id AND t.term_id = $user_id)
LEFT JOIN
(select post_parent, max(post_date_gmt) as latest_image_date from kb_posts
where post_type='attachment' GROUP BY post_parent) b
on a.id=b.post_parent
LEFT JOIN kb_posts c
on c.post_parent=a.id
and c.post_type='attachment'
and b.latest_image_date = c.post_date_gmt where c.guid IS NOT NULL
GROUP BY a.ID ORDER BY a.ID DESC LIMIT 5"