insert values from an array into mySQL Query - mysql

$test = array(10,20);
$rez = $this->Schimb->query("SELECT `pret`,`valuta` FROM schimb ORDER BY pret*{$test['valuta']} DESC");
I can't insert values from an array into MySQL Query...where is the problem?

The problem might be that you are trying to use your regular array as an associative array (indexed by a string key in this case). Try to use the array position as key instead.
$test[0], $test[1] etc...
Example:
$rez = $this->Schimb->query("SELECT `pret`,`valuta` FROM schimb ORDER BY pret{$test[0]} DESC");
But could it be the case that you should only ORDER BY the column pret instead?

Related

How to SELECT * WHERE JSON keys contain ANY/IN (array of values)

I am dealing with a Symfony "workflow" "Marker" and Postgres. (and Doctrine)
in the db, the column "status" contains JSON data like this
{"needs_address":1,"needs_contacts":1,"needs_education":1,"needs_health_and_social":1,"has_profile_photo":1,"has_letter":1}
I figured out how to query like this
SELECT id, profile_status, beneficiary_code
FROM public.beneficiary_profile
WHERE profile_status->>'needs_address' = '1'
How can I query for a list of status' like
('needs_education','needs_contacts','needs_address')
without writing it all out like
WHERE profile_status->>'needs_address' = '1'
OR profile_status->>'needs_contacts' = '1'
OR profile_status->>'needs_education' = '1'
I figure there must be a way with JSON functions and maybe IN() or ANY()
You will need to unnest the elements in order to be able to use an IN clause, something like:
select *
from public.beneficiary_profile p
where exists (select *
from jsonb_each_text(p.status) as x(ky,val)
where x.ky in ('needs_address', 'needs_contact', 'needs_education')
and x.val = '1');

Delete duplicated string in mysql

So i have this result row from a query with GROUP_CONCAT:
clients, employees, employees, providers, providers
And i wanna get something like this:
clients, employees, providers
Please, i'm new here and i need your help, be pacient if the question is not well formed
Use the DISTINCT option in GROUP_CONCAT()
SELECT GROUP_CONCAT(DISTINCT columnname), ...
Source: http://php.net/manual/en/function.array-unique.php
array_unique — Removes duplicate values from an array
array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )
maybe this is what you need:
$row = array_unique($row);
Edit: If I am not mistaken, sql returns the results as a key value array, so I think this is what you want.
Edit2: Do this:
$row = explode(",", $response);
$row = array_unique($row);

How to use an excludent IN?

I have the following code:
SELECT stores_tb.stores, sum(products_tb_tb.prices)
from products_tb
inner join stores_tb
on products_tb.id_store = stores_tb.id_store
where products_tb.barcode IN ($barcodes)
group by stores_tb.stores
order by sum(products_tb.prices)
Being the $barcodes an array (already converted to a string) that I receive via ajax in a php file that executes the MySQL.
The thing is that the IN is inclusive, using OR for each of the array values, meaning that if one of the stores required on the SELECT have one, but not all of the barcodes in the array, it will be shown.
I wanna know if there is a function like the IN (or a way to use the IN function) in which it will return only the stores that have all of the barcodes passed in the array, the equvilant of using AND instead of OR for each of the array values.
You can do this with a having clause:
select s.stores, sum(p.prices)
from products_tb p join
stores_tb s
on p.id_store = s.id_store
where p.barcode IN ($barcodes)
group by s.stores
having count(distinct p.barcode) = $n -- the number of codes that need to match
order by sum(p.prices);
The $n value is the length of the $barcodes list (strictly speaking, the number of unique items in it).
Instead of an array and an IN clause You could use a subselect and the ALL operator
SELECT stores_tb.stores, sum(products_tb_tb.prices)
from products_tb
inner join stores_tb
on products_tb.id_store = stores_tb.id_store
where products_tb.barcode = ALL (
select barcode from my_table )
)
group by stores_tb.stores
order by sum(products_tb.prices)
https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html
https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html

How can I get all keys from a JSON column in Postgres?

If I have a table with a column named json_stuff, and I have two rows with
{ "things": "stuff" } and { "more_things": "more_stuff" }
in their json_stuff column, what query can I make across the table to receive [ things, more_things ] as a result?
Use this:
select jsonb_object_keys(json_stuff) from table;
(Or just json_object_keys if you're using just json.)
The PostgreSQL json documentation is quite good. Take a look.
And as it is stated in the documentation, the function only gets the outer most keys. So if the data is a nested json structure, the function will not return any of the deeper keys.
WITH t(json_stuff) AS ( VALUES
('{"things": "stuff"}'::JSON),
('{"more_things": "more_stuff"}'::JSON)
)
SELECT array_agg(stuff.key) result
FROM t, json_each(t.json_stuff) stuff;
Here is the example if you want to get the key list of each object:
select array_agg(json_keys),id from (
select json_object_keys(json_stuff) as json_keys,id from table) a group by a.id
Here id is the identifier or unique value of each row. If the row cannot be distinguished by identifier, maybe it's better to try PL/pgSQL.
Here's a solution that implements the same semantics as MySQL's JSON_KEYS(), which...:
is NULL safe (i.e. when the array is empty, it produces [], not NULL, or an empty result set)
produces a JSON array, which is what I would have expected from how the question was phrased.
SELECT
o,
(
SELECT coalesce(json_agg(j), json_build_array())
FROM json_object_keys(o) AS j (j)
)
FROM (
VALUES ('{}'::json), ('{"a":1}'::json), ('{"a":1,"b":2}'::json)
) AS t (o)
Replace json by jsonb if needed.
Producing:
|o |coalesce |
|-------------|----------|
|{} |[] |
|{"a":1} |["a"] |
|{"a":1,"b":2}|["a", "b"]|
Insert json_column and table
select distinct(tableProps.props) from (
select jsonb_object_keys(<json_column>) as props from <table>
) as tableProps
I wanted to get the amount of keys from a JSONB structure, so I'm doing something like this:
select into cur some_jsonb from mytable where foo = 'bar';
select into keys array_length(array_agg(k), 1) from jsonb_object_keys(cur) as k;
I feel it is a little bit wrong, but it works. It's unfortunate that we can't get an array directly from the json_object_keys() function. That would save us some code.

Extract columns names resulting by query

is it possible to get the columns names resulting by a query?
So (for example) if I have this query:
SELECT Id AS IdNumber,
(SELECT COUNT(*) FROM tab2 WHERE IdRif = T1.Id) AS TotCount
FROM tab1 T1
I'd like to get:
IdNumber
TotCount
I saw MySQL query to get column names? (and also other questions) but I wasn't able to use it for what I need.
If your query returns results just use the object(fetch_object) / array (fetch_assoc) from the row and use array_keys($row)
if no rows are returned use http://php.net/manual/en/mysqli-result.fetch-field-direct.php
$result = $db->query($sql);
$i = 0;
while ($i < $db->field_count) {
$info = $result->fetch_field_direct($i++);
echo $info->name;
}
as an example
You can fetch the query result into an Associative Array using mysql_fetch_array($result,MYSQL_ASSOC) or $result->fetch_array(MYSQLI_ASSOC) or whatever method you are using, so that the Key=>Value pair of your Associative Array would be your ColumnName=>ColumnValue.
So, irrespective of whether you are using mysql or mysqli, you would be using the same logic to get the column names.