Custom SQL query to get most viewed posts with images - mysql

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

Related

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.

combine two sql queries -

I've have two sql queries which I'm trying to combine
The first:
SELECT * FROM wp_posts
JOIN wp_postmeta on (post_id=ID)
WHERE meta_key = "packageID" and meta_value = 1
ORDER BY post_date limit 50
Joins the wordpress wp_post table to the wp_postmeta and gets all the posts meeting with packageID = 1 (I think it might be an inelegant way of doing it but it works)
The second
SELECT * FROM wp_postmeta
JOIN wp_posts ON (meta_value=ID)
WHERE post_id = 2110
AND meta_key = '_thumbnail_id'
again joins the wp_post table to the wp_postmeta table, so for the post with the id 2110 it successfully gets the thumbnail for that posts. NB 2110 is just an example of an id
In Wordpress a thumbnail is a kind of post. So in this example the text which constitutes post 2110 is a associated with post 2115 - the latter being the thumbnail
What I'm trying to do is get the list as in the first query but also get thumbnails associated with each post
I think I need two joins but I can't see how to do it (being an sql beginner)
NB this will be in a script outside Wordpress so I can't use Wordpress's built-in functions
You can try this one,if there are more than one thumbnails for the post you can get the list of thumbnails separated by comma
SELECT
*,
(SELECT
GROUP_CONCAT(meta_value)
FROM
wp_postmeta
WHERE post_id = wp.ID
AND wpm.meta_key = "_thumbnail_id") AS `thumbnails`
FROM
wp_posts wp
JOIN wp_postmeta wpm
ON (wpm.post_id = wp.ID)
WHERE wpm.meta_key = "packageID"
AND wpm.meta_value = 1
ORDER BY wp.post_date
LIMIT 50
Note : GROUP_CONCAT has a limit to concat characters but you
can increase this limit
To get only one thumbnail you can try this
SELECT
*,
(SELECT
(meta_value)
FROM
wp_postmeta
WHERE post_id = wp.ID
AND wpm.meta_key = "_thumbnail_id" LIMIT 1)
FROM
wp_posts wp
JOIN wp_postmeta wpm
ON (wpm.post_id = wp.ID)
WHERE wpm.meta_key = "packageID"
AND wpm.meta_value = 1
ORDER BY wp.post_date
LIMIT 50
try with the following code
SELECT * FROM wp_posts wp JOIN wp_postmeta wm on (wp.post_id=wm.ID) WHERE wp.meta_key = "packageID" and wp.meta_value = 1 ORDER BY wp.post_date limit 50;
use proper alias and try it.
Try using the post_type column. The attachments have a post_type of 'attachment'. I can further explain if needed.
Also the post to which the thumbnail is attached to will be in the column post_parent.
global $wpdb;
$query7 = "SELECT distinct wp_postmeta.meta_value, wp_postmeta.meta_key, wp_posts.ID
FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_posts.post_status = 'publish'
AND wp_postmeta.meta_key = 'packageID'
AND wp_postmeta.meta_value = 1
AND (mt1.meta_key LIKE '_thumbnail_id')
$output = $wpdb->get_results( $query7 );
Use join with different aliases when joining same table more than once.
Hope this helps.
Try this
SELECT * FROM wp_posts P1
LEFT JOIN wp_postmeta M1 ON (M1.post_id=P1.ID)
WHERE (M1.meta_key = "packageID" and M1.meta_value = 1 )
LEFT JOIN wp_postmeta M2 ON (M2.meta_key=P1.ID AND M2.meta_key = '_thumbnail_id')
LEFT JOIN wp_posts P2 ON (M2.meta_value=P2.ID)
ORDER BY P1.post_date limit 50

MySQL left join needed on Wordpress database

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";

mysql update data using 3 table

I did own custom table in wordpress base, and now i need update the table using data from wopdpress's tables (thundbail link)
Here select query
SELECT p.post_parent, guid
FROM wp_postmeta AS pm
INNER JOIN wp_posts AS p ON pm.meta_value=p.ID
WHERE pm.post_id = 1552
AND pm.meta_key = '_thumbnail_id'
ORDER BY p.post_date DESC
LIMIT 1
Answer:
post_parent (fullproducts = postid) | guid (fullproducts = image)
1552 | URL
I tryed this code for update this table
UPDATE full_products, wp_postmeta AS pm
SET full_products.image = wp_postmeta.guid
INNER JOIN wp_posts AS p ON pm.meta_value=p.ID
WHERE pm.post_id = full_products.postid
AND pm.post_id = 1552
AND pm.meta_key = '_thumbnail_id'
ORDER BY p.post_date DESC
LIMIT 1
But this query doesnt work. Could you check it?
The way you used UPDATE with INNER JOIN have syntax error, the correct syntax is
UPDATE full_products a
LEFT JOIN wp_postmeta AS pm
ON a.postid = pm.post_id
LEFT JOIN wp_posts AS p
ON pm.meta_value=p.ID
SET a.image = pm.guid
WHERE pm.post_id = 1552
AND pm.meta_key = '_thumbnail_id'

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"