How to sort result by owner ID SQL, Seqelize? - sql

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.

Related

Minimize Pagination Vue.js

I have a pagination and it looks like this: < 1 2 3 4 5 6 7 8 9 >
But it's too big, so I need to display them like this: < 1 2 3 4 ... 21>
This is my template:
ul.pagination.float-right
li.page-item
a.page-link(v-on:click="prevPage()")
i.icon.ion-ios-arrow-back
li(v-for="n in numberOfPages")
a.page-link(#click="goToPage(n)", :limit="3" :style= "[actualPage == n && {backgroundColor: '#d3d3d3'}]") {{n}}
li.page-item
a.page-link(v-on:click="nextPage()")
i.icon.ion-ios-arrow-forward
and my script:
data () {
return {
numberOfPages: 0,
roles: [],
rolesInPage: [],
actualPage: 1,
elementsByPage: 10,
prevPage () {
if (this.actualPage > 1) {
this.actualPage = this.actualPage - 1
}
const from = this.elementsByPage * (this.actualPage - 1)
this.rolesInPage = this.roles.slice(from, from + 10)
},
nextPage () {
if (this.actualPage < this.numberOfPages) {
this.actualPage = this.actualPage + 1
}
const from = this.elementsByPage * (this.actualPage - 1)
this.rolesInPage = this.roles.slice(from, from + 10)
},
getNumberOfPages () {
return Math.ceil(this.roles.length / this.elementsByPage)
},
goToPage (page) {
this.actualPage = page
const from = this.elementsByPage * (this.actualPage - 1)
this.rolesInPage = this.roles.slice(from, from + this.elementsByPage)
},
Any help will be much appreciated
I wrote a basic solution, but needs some improvements and you'll need to validate in your frontend what's the limit of pages to show and place those dots between them.
The basic solution
That function returns an array with just the indexes you want and an extra index with the total of pages you already had.

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

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;
});
}

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)
}

Get List inside List

I have a complex data structure and I had to create this short example for better understanding.
type alias People =
{ name : String
, sex : String
, phones : List Phone
}
type alias Phone =
{ number : String
, isActive : Bool
}
This structure populated:
people = [
{ name = "_me"
, sex = "M"
, phones = [
{ number = "(99) 99 9 9999-9999"
, isActive = True
}]
},
{ name = "_you"
, sex = "M"
, phones = [
{ number = "(11) 11 1 1111-1111"
, isActive = True
},
{ number = "(22) 22 2 2222-2222"
, isActive = False
}]
}]
And I would like to get only the 'phones' from the 'people' list, as in the example below
phones = [
{ number = "(99) 99 9 9999-9999"
, isActive = True
},
{ number = "(11) 11 1 1111-1111"
, isActive = True
},
{ number = "(22) 22 2 2222-2222"
, isActive = False
}]
I've been trying for 3 days, but to no avail.
You can pull out all the phone numbers into a list by mapping over to get the phone number list of a person, then concatenating those phone number lists together:
getPhones : List People -> List Phone
getPhones = List.concat << List.map .phones