Laravel Eloquent - Return unique values only and ignore all that appear more than once - sql

I have 2 database tables.
|---------------------|------------------|
| Users | Matches |
|---------------------|------------------|
| user_id | match_id |
|---------------------|------------------|
| user_1 |
|------------------|
| user_2 |
|------------------|
with user_1 and user_2 being user_ids.
I am now trying to retrieve all matches with unique values only. As soon as a user ID is used twice, I don't want to retrieve ANY matches containing the id.
Example:
MATCHES (match_id, user_1, user_2):
1, 1, 2
2, 1, 3
3, 4, 5
4, 6, 7
5, 7, 8
The query should return 3, 4, 5 ONLY, because it's the only match containing only unique user_ids.
How should I go about this? I've been trying an approach using ->distinct() but that doesn't work since it only removes duplicates but I want to kick other entries containing the values as well.

Simple and crude, not a query based solution, but will get you what you want.
public function strictlyUniqueMatches()
{
$matches = Matches::distinct()->get();
$present = [];
foreach ($matches as $idx => $match) {
if (!isset($present[$match->user_1])) {
$present[$match->user_1] = 0;
}
if (!isset($present[$match->user_2])) {
$present[$match->user_2] = 0;
}
$present[$match->user_1]++;
$present[$match->user_2]++;
}
return $matches->filter(function ($match) use ($present) {
if ($present[$match->user_1] > 1) {
return false;
}
if ($present[$match->user_2] > 1) {
return false;
}
return true;
});
}

Related

How to sort result by owner ID SQL, Seqelize?

Please note the below contents:
user table
where condition 1
1 USER TABLE
id owneeId delete shop
1 12 1 1
2 13 1 1
3 7 1 1
4 7 1 1
2 Where condition 1 of sequelize :
const result = await findAllusers({
where: {
[Op.or]: [{
owner_id: {
[Op.in]: rows.map(['12','13']),
}
}, {
owner_id: {
[Op.notIn]: rows.map(['12','13']),
},
shop: 1
}]
}
Desired Result :
I need result as :
result = [{id:1,ownerid:7,delete:1,shop:1},
{id:2,ownerid:7,delete:1,shop:1},
{id:3,ownerid:12,delete:1,shop:1},
{id:4,ownerid:13,delete:1,shop:1}]
the ownerid 7 peoples first ... then all other users.. but I am now getting result not sorted like that, and sometimes I am getting ownerid 7 perosna as last elements.

Google Apps Script for BigQuery - different results of REGEXP_CONTAINS

I have troubles with my own SQL and REGEXP_CONTAINS, so I decided to test official BigQuery example from here. I used SQL from example, which shows how the REGEXP_CONTAINS works. See the SQL here:
SELECT
email,
REGEXP_CONTAINS(email, r'^([\w.+-]+#foo\.com|[\w.+-]+#bar\.org)$')
AS valid_email_address,
REGEXP_CONTAINS(email, r'^[\w.+-]+#foo\.com|[\w.+-]+#bar\.org$')
AS without_parentheses
FROM
(SELECT
['a#foo.com', 'a#foo.computer', 'b#bar.org', '!b#bar.org', 'c#buz.net']
AS addresses),
UNNEST(addresses) AS email;
+----------------+---------------------+---------------------+
| email | valid_email_address | without_parentheses |
+----------------+---------------------+---------------------+
| a#foo.com | true | true |
| a#foo.computer | false | true |
| b#bar.org | true | true |
| !b#bar.org | false | true |
| c#buz.net | false | false |
+----------------+---------------------+---------------------+
This SQL works as expected when I compose new query directly in BigQuery editor. But If I want to use SQL with the REGEXP_CONTAINS in Google Apps Script, then it doesn't work. The script I use is:
/**
* Runs a BigQuery query and logs the results in a spreadsheet.
*/
function testSQL() {
// Replace this value with the project ID listed in the Google
// Cloud Platform project.
var projectId = 'bigquery-xxxx';
var request = {
query: 'SELECT '+
'email, '+
'REGEXP_CONTAINS(email, r"^([\w.+-]+#foo\.com|[\w.+-]+#bar\.org)$")'+
' AS valid_email_address, '+
'REGEXP_CONTAINS(email, r"^[\w.+-]+#foo\.com|[\w.+-]+#bar\.org$")'+
' AS without_parentheses '+
'FROM'+
' (SELECT'+
' ["a#foo.com", "a#foo.computer", "b#bar.org", "!b#bar.org", "c#buz.net"]'+
' AS addresses),'+
' UNNEST(addresses) AS email;',
useLegacySql: false
};
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
}
// Get all the rows of results.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
if (rows) {
var spreadsheet = SpreadsheetApp.create('BiqQuery Results');
var sheet = spreadsheet.getActiveSheet();
// Append the headers.
var headers = queryResults.schema.fields.map(function(field) {
return field.name;
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
sheet.getRange(2, 1, rows.length, headers.length).setValues(data);
Logger.log('Results spreadsheet created: %s',
spreadsheet.getUrl());
} else {
Logger.log('No rows returned.');
}
}
The script above creates the sheet and the results are:
What is wrong with REGEXP_CONTAINS?

Node Postgres insert multiple rows based on array and static variable

I am trying to insert multiple rows into a PostgresSQL server from my Nodejs server based on an array. I have a static variable, user_id, which would be the same for all entries but I want to change the filter_name based off an array. My goal is to not make multiple SQL insert calls.
arrayOfFilters = ["CM", "CBO", "SA", "EPS", "AD"]
await db.query(
"INSERT INTO filters(filter_name, requests_id)VALUES($1, $2)",
[arrayOfFiltersParams, user_id]);
I am hoping to have a row in the filters table for each one of the filters found in the arrayOfFilters with a matching user_id key for each entry (aka 5 rows for this example).
Thanks so much!
Write a helper function expand to build Parameterized query. Here is a solution:
import { pgclient } from '../../db';
function expand(rowCount, columnCount, startAt = 1) {
var index = startAt;
return Array(rowCount)
.fill(0)
.map(
(v) =>
`(${Array(columnCount)
.fill(0)
.map((v) => `$${index++}`)
.join(', ')})`,
)
.join(', ');
}
function flatten(arr) {
var newArr: any[] = [];
arr.forEach((v) => v.forEach((p) => newArr.push(p)));
return newArr;
}
(async function test() {
try {
await pgclient.connect();
// create table
await pgclient.query(`
CREATE TABLE IF NOT EXISTS filters (
id serial PRIMARY KEY,
filter_name VARCHAR(10),
requests_id INTEGER
)
`);
// test
const arrayOfFilters = ['CM', 'CBO', 'SA', 'EPS', 'AD'];
const user_id = 1;
const arrayOfFiltersParams: any[] = arrayOfFilters.map((el) => [el, user_id]);
await pgclient.query(
`INSERT INTO filters(filter_name, requests_id) VALUES ${expand(arrayOfFilters.length, 2)}`,
flatten(arrayOfFiltersParams),
);
} catch (error) {
console.log(error);
} finally {
pgclient.end();
}
})();
After executed above code, check the database:
node-sequelize-examples=# select * from "filters";
id | filter_name | requests_id
----+-------------+-------------
1 | CM | 1
2 | CBO | 1
3 | SA | 1
4 | EPS | 1
5 | AD | 1
(5 rows)

How to return nested JSON?

I have 3 table in PostgreSQL database.
QUESTIONS table:
| id (int) | text (text) |
|----------|--------------------------------------|
| 1 | What is your favorite color? |
| 2 | What is your favorite football club? |
OPTIONS table:
| id (int) | text (text) |
|----------|-------------|
| 1 | red |
| 2 | blue |
| 3 | grey |
| 4 | green |
| 5 | brown |
QUESTIONS_OPTIONS table:
| question_id (int) | option_id (int) |
|-------------------|-----------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
In Golang application I create such models:
type Option struct {
ID int `json:"option_id"`
Text string `json:"option_text"`
}
type Question struct {
ID int `json:"question_id"`
Text string `json:"question_text"`
Options []Option `json:"options"`
}
In controller I have such code:
var GetQuestions = func(responseWriter http.ResponseWriter, request *http.Request) {
rows, _ := database.DBSQL.Query("SELECT * FROM questions;")
defer rows.Close()
var questions []Question
for rows.Next() {
var question Question
var options []Option
queries, _ := database.DBSQL.Query(`select options.id as option_id, options.text as option_text from questions_options inner join questions on questions_options.question_id = ` + &question.ID + ` inner join options on questions_options.option_id = options.id`)
queries.Close()
for queries.Next() {
var option Option
if err := queries.Scan(&option.ID, &option.Text); err != nil {
log.Println(err)
}
options = append(options, option)
}
if err := rows.Scan(&question.ID, &question.Text, options); err != nil { // service raise error in this line: sql: expected 2 destination arguments in Scan, not 3
log.Println(err)
}
questions = append(questions, question)
}
utils.Response(responseWriter, http.StatusOK, questions)
}
When I try to make GET request to take all questions with all there options service such incorrect result:
[
{
"question_id": 0,
"question_text": "",
"options": null
},
{
"question_id": 0,
"question_text": "",
"options": null
}
]
Where I make mistake?
You should move queries.Close() to the end of loop, like this:
var GetQuestions = func(responseWriter http.ResponseWriter, request *http.Request) {
rows, _ := database.DBSQL.Query("SELECT * FROM questions;")
defer rows.Close()
var questions []Question
for rows.Next() {
var question Question
if err := rows.Scan(&question.ID, &question.Text); err != nil {
log.Println(err)
continue
}
queries, _ := database.DBSQL.Query(`select options.id as option_id, options.text as option_text from questions_options inner join questions on questions_options.question_id = $1 inner join options on questions_options.option_id = options.id`, question.ID)
for queries.Next() {
var option Option
if err := queries.Scan(&option.ID, &option.Text); err != nil {
log.Println(err)
}
question.Options = append(question.Options, option)
}
queries.Close()
questions = append(questions, question)
}
utils.Response(responseWriter, http.StatusOK, questions)
}

SQL Query to show login count for each user in Wordpress

I would like a query that displays the number of times each user has logged in to Wordpress. The result would be something like:
User | Login_count
------------------
user1 | 2
------------------
user2 | 5
------------------
user3 | 0
etc..
Any ideas?
This should help get you started:
add_action('wp_login', 'db_increment');
function db_increment($login)
{
....
}
Is better to use update_user_meta instead create separate SQL queries to achieve such a simple functionality.
Code (functions.php) for that will looks like:
function my_handle_login($username, $user) {
$login_count = intval(get_user_meta($user->ID, 'user_count', true));
$login_count++;
update_user_meta($user->ID, 'user_count', $login_count);
}
add_action('wp_login', 'my_handle_login', 10, 2);
function new_modify_user_table( $column ) {
$column['counter'] = 'Logins Count';
return $column;
}
add_filter( 'manage_users_columns', 'new_modify_user_table' );
function new_modify_user_table_row( $val, $column_name, $user_id ) {
$user = get_userdata( $user_id );
switch ($column_name) {
case 'counter' :
return get_the_author_meta( 'user_count', $user_id );
break;
default:
}
return $return;
}
add_filter( 'manage_users_custom_column', 'new_modify_user_table_row', 10, 3 );