I want the the database query result to output the record of last seven days (referral_users ) - mysql

get_results( "SELECT u.ID,
( SELECT meta_value FROM " . $wpdb -> prefix . "usermeta WHERE meta_key = 'first_name' AND user_id = u.ID ) AS firstname,
( SELECT meta_value FROM " . $wpdb -> prefix . "usermeta WHERE meta_key = 'last_name' AND user_id = u.ID ) AS lastname,
( SELECT COUNT( user_id ) FROM " . $wpdb -> prefix . "usermeta WHERE meta_key = 'user_parent' AND meta_value = u.ID ) AS referral_users
FROM
" . $wpdb -> prefix . "users AS u
WHERE
( SELECT COUNT( user_id ) FROM " . $wpdb -> prefix . "usermeta WHERE meta_key = 'user_parent' AND meta_value = u.ID ) > 0
ORDER BY referral_users DESC LIMIT 10 OFFSET 0" );

Related

How to change a query in mysql so it retrieve 30 rows randomly

I'd like to change this query in my WordPress plugin so that it retrieves 30 random rows out of 100.
$query = $wpdb->prepare("
SELECT
p.*, qq.quiz_id, qq.question_order AS order
FROM
{$wpdb->posts} p
INNER JOIN
{$wpdb->prefix}learnpress_quiz_questions qq ON p.ID = qq.question_id
WHERE
qq.quiz_id IN (" . join( ',', $format ) . ")
AND
p.post_status = %s
", $args );
I've changed it to this but it still does not work. Could any body help me ,please?
SELECT
p.*, qq.quiz_id, qq.question_order AS order
FROM
{$wpdb->posts} p
INNER JOIN
{$wpdb->prefix}learnpress_quiz_questions qq ON p.ID = qq.question_id
WHERE
qq.quiz_id IN (" . join( ',', $format ) . ")
AND
p.post_status = %s
ORDER BY
RAND() LIMIT 30
Change your sort to something like this:
order by RAND() * 30
or if you have an integer id:
order by RAND() * id

union with group by mysql

Hi I have a query as follows but group by is not working.
SELECT messages.thread_id,messages.subject,messages.message_id,messages.status,messages.attachment,login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as date from messages inner join login on messages.receiver = login.id where (messages.sender = '" . mysql_real_escape_string(trim($_SESSION['login_id'])) . "' and messages.status = 'trash' )
UNION SELECT messages.thread_id,messages.subject,messages.message_id,messages.status,messages.attachment,login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as date from messages inner join login on messages.sender = login.id where (messages.receiver = '" . mysql_real_escape_string(trim($_SESSION['login_id'])) . "' and messages.status = 'trash') GROUP BY messages.thread_id
Wrap your query to an outer query so that it can group the combined results from both the queries.
SELECT z.*
FROM
(
SELECT messages.thread_id, messages.subject, messages.message_id, messages.status,
messages.attachment, login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as date
FROM messages
INNER JOIN login ON messages.receiver = login.id
WHERE messages.sender = '" . mysql_real_escape_string(trim($_SESSION['login_id'])) . "'
AND messages.status = 'trash'
UNION
SELECT messages.thread_id, messages.subject, messages.message_id, messages.status,
messages.attachment, login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as date
FROM messages
INNER JOIN login ON messages.sender = login.id
WHERE messages.receiver = '" . mysql_real_escape_string(trim($_SESSION['login_id'])) . "'
AND messages.status = 'trash'
) AS z
GROUP BY z.thread_id
You have to put brackets around the union select, give it an alias and select from it:
SELECT A.* FROM
(messages.thread_id,messages.subject,messages.message_id,messages.status,mess
ages.attachment,login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as
date from messages inner join login on messages.receiver = login.id
where (messages.sender = '" .
mysql_real_escape_string(trim($_SESSION['login_id'])) . "' and
messages.status = 'trash' )
UNION SELECT
messages.thread_id,messages.subject,messages.message_id,messages.status,messa
ges.attachment,login.name, DATE_FORMAT( messages.date, '%D-%b-%Y' ) as
date from messages inner join login on messages.sender = login.id where
(messages.receiver = '" .
mysql_real_escape_string(trim($_SESSION['login_id'])) . "' and
messages.status = 'trash')) AS A
GROUP BY A.thread_id

Laravel Join with Where (Case) and AND

I'm having problem converting my SQL query to laravel queries. I want to join two tables users and messages so that i can get the users that has conversation with other users.
Database Structure:
Users:
Messages:
This is my SQL query where I get what I want:
SELECT u.id, c.id, u.first_name, u.last_name FROM messages c, users u
WHERE (CASE WHEN c.user_one = #USERID THEN c.user_two = u.ID WHEN c.user_two = #USERID THEN c.user_one= u.id END )
AND ( c.user_one = #USERID OR c.user_two = #USERID ) Order by c.id DESC Limit 20
This is my Laravel query:
DB::table('messages')
->join('users', function($join) use ($user_id) {
$join->select(DB::raw('CASE WHEN messages.user_one = ' . $user_id . ' THEN messages.user_two = ' . $user_id . 'WHEN messages.user_two = ' . $user_id . ' THEN messages.user_one = ' . $user_id));
$join->on(function($query) use ($user_id)
{
$query->where('messages.user_one', '=', $user_id);
$query->orWhere('messages.user_two', '=',$user_id);
});
})
->select('users.*', 'messages.*')
->get();

MySQL LIKE operator behaving like = operator

It seems MySQL's LIKE operator behaves like a = operator.
The following MySQL query returns the expected result (1 entry):
$meta_key = '_locality';
$meta_value = 'The Hague';
$post_ids = $wpdb->get_col( $wpdb->prepare(
"
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value LIKE %s
",
$meta_key,
$meta_value
) );
But the following, with only part of the original meta_value, returns an empty array:
$meta_key = '_locality';
$meta_value = 'The';
$post_ids = $wpdb->get_col( $wpdb->prepare(
"
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value LIKE %s
",
$meta_key,
$meta_value
) );
What am I doing wrong here?
Please read mysql pattern matching syntax carefully: http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html . You lose '%' for LIKE matching:
$meta_key = '_locality';
$meta_value = '%The Hague%';
$post_ids = $wpdb->get_col( $wpdb->prepare(
"
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value LIKE %s
",
$meta_key,
$meta_value
) );

Wordpress SQL - Multiple WHERE clauses

Ok it has been a while since I last wrote an sql query. I have the following query
$user_search->query_where =
str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE {$wpdb->usermeta}.meta_key = 'select_team_leader'
AND {$wpdb->usermeta}.meta_value = {$user_leader})",
$user_search->query_where
);
I want to add an OR statement like
OR {$wpdp->usermeta}.user_id = {$user_leader}
Do I need to use an inner join for this ? thanks
No you don't need to use an extra join you just have to organize your query to look for either user id or meta_value
$user_search->query_where =
str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE {$wpdb->usermeta}.meta_key = 'select_team_leader'
AND
(
{$wpdb->usermeta}.meta_value = {$user_leader}
OR {$wpdp->usermeta}.user_id = {$user_leader}
)
)",
$user_search->query_where
);
So above query will look for meta_value is equal to provided value ie. {$user_leader} or user_id is equal to {$user_leader} but whatever matches meta_key should be select_team_leader
Edit from comments
$user_search->query_where =
str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE (
{$wpdb->usermeta}.meta_key = 'select_team_leader'
AND {$wpdb->usermeta}.meta_value = {$user_leader}
)
OR {$wpdp->usermeta}.user_id = {$user_leader}
)",
$user_search->query_where
);