PHP Mysql MAX() returning wrong result - php

PHP:
$result = mysql_query("SELECT MAX(something) AS something FROM users");
$row = mysql_fetch_assoc($result);
$max = $row["something"];
echo $max;
Mysql:
+-----------+----------+
| Something | Name |
+-----------+----------+
| 9 | John |
| 984 | Somebody |
| 1 | Who |
Code results: 9, the question is why? Mysql "something" type is "text". My mysql table is bigger than this above, but it still results not the biggest "something".

Either do a math operation on the column to trigger an auto-cast
SELECT MAX(something * 1) AS something FROM users#
or cast explicitly with
SELECT MAX(cast(something as signed)) AS something FROM users
but even better - if that column only contains numbers then change the data type of that field ti int for instance.

Related

do the math for each data in database sql post result to database in php

I'd like to fetch data from my 2 sql database and do some math and post the result in database
let's say my table1 is like this
+---+---+----------------------------+
| A | B | C |
+---+---+----------------------------+
| 2 | 9 | result from A*B*D*E in php |
| 1 | 8 | result from A*B*D*E in php |
| 4 | 7 | result from A*B*D*E in php |
| 3 | 6 | result from A*B*D*E in php |
| 6 | 5 | result from A*B*D*E in php |
| 6 | 5 | result from A*B*D*E in php |
| 5 | 4 | result from A*B*D*E in php |
+---+---+----------------------------+
and my table2 is like this
+---+----+
| D | E |
+---+----+
| 1 | 9 |
| 2 | 7 |
| 3 | 8 |
| 4 | 6 |
| 5 | 5 |
| 6 | 3 |
| 7 | 2 |
+---+----+
so far what i've done
// database connection
include_once("config.php");
// Query
$query = mysqli_query($conn, "SELECT * FROM table1");
$query2 = mysqli_query($conn, "SELECT * FROM table2");
//Source1
while($user_data1 = mysqli_fetch_array($query))
{
$A[] = $user_data1['A'];
$B[] = $user_data1['B'];
}
//Source2
while($user_data2 = mysqli_fetch_array($query2))
{
$D[] = $user_data2['D'];
$E[] = $user_data2['E'];
}
foreach (array_combine($A, $B) as $ValueA=> $ValueB)
{
foreach (array_combine($D, $E) as $ValueD=> $ValueE)
{
$result1 = $ValueA*$ValueB*ValueD*ValueE;
$val = 0.123;
$result2[] = $result1*$val;
}
$final result = min($result2);
echo round($final result, 2);
unset($result2);
}
I haven't inserted the database yet
still echoing for debug if the math is correct
somehow this code found some bug
for example using my database the final result only echo/showing 6 math result
because in table1 row 5 and 6 has same data
btw of course in my table1 and 2 has primary key
To change C in this case, you don't even need PHP. To UPDATE a value in MySQL with multiple tables just add them with a , when selecting the tables, like this:
UPDATE table1,table2 SET C = table1.A * table1.B * table2.D * table2.E WHERE C IS NULL;
Executing this code once will update all rows so that C = A*B*D*E as wanted where C is not yet set or NULL. If you want to update all rows you can just remove the WHERE condition
Note: Sometimes (at least for me) SQL will give a warning when having no WHERE condition in the SQL query. To bypass this just add WHERE 1=1 at the end.
Just for my understanding: you want to calculate a value for your calculation you need some data from table 1 that is clear, but also from table2 But which one? I guess you want to use the data from the same row ( so row 1 from table1 and row 1 from table2, row 2 from table 1 and row 2 from table2 ) right? Now you have an problem because when you make a select * from table You do not know in which order they give back from your database. Most time it may be the same order as you have input them, but there is no garantie. You have sayed you have an primary key on each table, how have you defined them? I guess you may have a id column, so you can join your table on that id?

Print multiple rows returned by mysql to php

I want to make a php web page which will query the mysql db and mysql might return more than 1 row.
I want to print those rows one after another.
$query = "SELECT * FROM tables WHERE name = 'table1';";
$req = mysqli_query($conn, $query);
$res = mysqli_fetch_assoc($req);
I want to print something like this
Poem_id | Poem_content | Poem_by | Poem_hotscore
------------ ----------------- ----------- -----------------
1 | Blah Bleh<br>B.| 4 | 5342.3920349
7 | Blah Bluu<br>F.| 4 | 5003.3920382
9 | Blerp Bloop Foo| 34 | 4300.7281209
while (($res = mysqli_fetch_assoc($req)) !== NULL)
echo $res["Poem_id"]." | ".$res["Poem_content"]."<br />"; // and so on
Please note that php array keys are case sensitive. So there's a difference between
$res["Poem_id"]
and
$res["poem_id"]
Also don't forget to use htmlentities().

choose rows where 10 columns

I want to get a rows using one string, but this string is used to validate more than 1 column, exactly 5, for example
-----------------------------------------------
| id | code | 1 | 2 | 3 | 4 | 5 |
-----------------------------------------------
| 01 | Number | 5 | 7 | 10 | 21 | 1 |
| 02 | String | v | q | s | f | w |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------
I want to make SELECT mysqli where using 5 columns ( 1, 2, 3, 4, 5 ) if i use looping method, it will waste a lot of time
i have tried the problem with this code
$value = "q";
for ($x = 1; $x <= 5; $x++) {
$cek = mysqli_query($con,"SELECT * FROM table where $x='$value' and id='02'")
if(mysqli_num_rows($cek) == 1) {
echo "success";
} else {
echo "fail";
}
}
I use this code successfully, but the process is too long
is there an easier and more practical way to overcome this problem? thank you
As has been pointed out in comments, your database design is sub-optimal. You may want to reconsider and change it. Also, having column names be 1, 2, etc. is a very bad idea. At least have them start with a letter. Better yet, give them some reasonable names indicating what data those columns actually contain.
Now, assuming you figured out what your column names should really be, you can use a simple IN operator to get your data. The usual/common way of using it is
WHERE some_column IN ('value1', 'value2', ...)
Yet, there's nothing preventing you from using it the other way around:
WHERE 'some_value' IN (column1, column2, ...)
This way, your SQL statement becomes something like this:
SELECT *
FROM table
WHERE '$value' IN (column1, column2, column3, column4, column5)
AND id='02'
Now, if you have your column names in an array, you can do it this way:
$testColumns = ['column1', 'column2', 'column3', 'column4', 'column5'];
$value = "q";
$inColumns = implode(',', $testColumns);
$sql = "SELECT * FROM table WHERE '$value' IN ($inColumns) AND id='02'";
$cek = mysqli_query($con, $sql);
UPDATE: If your column names are non-standard, e.g. the aforementioned 1, 2, etc., or have spaces in them, then simple implode will not work, because you need to back-quote each column name. In that case, you would need something like this:
$inColumns = implode(',', array_map(function($c) { return "`$c`"; }, $columns));

MySQL PHP select where "X,Y" is in X,Y,Z

How do I complete this code below? I am trying to select news from the database and the locations which can be 23,22,88,90 location codes. I know you can just do IN('23', '22', '88', '90') but the problem is, my locations are a string so it comes out like IN('23,22,88,90') I believe.
How do I expand on the string of locations and select all or any including the locations in the string? So in the database, newsLocations could be 22 23 22,90 23,80,90 90. If that makes sense? so if $locationstoGet has 22,88,90 only, it will get the newsLocation even if the result is just 88,90 without the 22.
$locationsToGet = '22,88';
$db->query("SELECT * FROM news WHERE newsLocation IN($locationstoGet)");
I hope I explained this alright.
I saw a response on another site here
So I will adapt the solution there to your scenario. Change locationsToGet into an array, and use the implode function to generate the right syntax for the IN Clause.
$locationsToGetArr = array('22','88');
$locations = "'".implode("','",$locationsToGetArr)."'"; //this should output '22','88'
$db->query("SELECT * FROM news WHERE newsLocation IN($locations)");
This solution is assuming your database structure is as such
+--------+--------------+
| news | newsLocation |
+--------+--------------+
| 1 | 88 |
| 1 | 22 |
| 2 | 22 |
| 2 | 88 |
+--------+--------------+
But if you are storing your data as the following instead
+--------+--------------+
| news | newsLocation |
+--------+--------------+
| 1 | 88,22 |
| 2 | 22,88 |
+--------+--------------+
You will not have much choice besides to select all from news table and have PHP filter the location. Not a very efficient method.
If your data is comma separated stored in databse column then you can use MYSQL FIND IN SET as per below example.
SELECT FIND_IN_SET('b','a,b,c,d');
OR you can try with regular expression in MYSQL but it will be too slow.
You can make an array of your locations and then populate your query string with the items from the array
$locations = '22,88';
$locationsToGetArray = explode(",", $locationToGet)
$query = "SELECT * FROM news WHERE newsLocation IN(";
for ($i = 0; $i < count($locationsToGetArray); $i++) {
$query .= $locationsToGetArray[$i];
if($i == (count($locationToGetArray) - 1)) $query.= ")";
else $query .= ",";
}
$db->query($query);

Creating a column number with the number in the column

id | ozID | ozDa1 | ozDa2 | ozDa3
-----------------------------------------------
1 | 3,4 | Khar | Lorem | Emre
2 | 1,2 | Imson | Berkay | ade
3 | 2 | abc | Goksel | casc
4 | 5 | teq | Insanlik | fdsc
5 | 1,5,2 | asd | Oyle | asdas
6 | 2,1 | fav | Boyle | dsssa
7 | 3 | qwrewq | Filan | dcsd
I can write the content like:
$partNameWD->ozDa2; // Berkay
But the number at the end can be variable, like this: ozDa4.
At first I get the data from the ozID table, for example: 1,2
What does it mean 1,2?
It points to column numbers: ozDa1 and ozDa2
Access to this number is like this:
$ozColNo = explode(",", $partNameWD->ozID);
foreach (ozColNo as $ozColId) {
echo ozColId." - "; // 1 - 2
}
So what is my problem?
How do I get data from the column with these numbers? So, how can I print the data from one and the second
It has to be transformed: ozDa1 // Imson and ozDa2 // Berkay
Please can you tell me the method?
Thanks
I'm not 100% sure that I correctly understand the question, but you can get the mapping between "column number" and "column name" in information_schema.columns. So, if you are given a number, you can look up the name using:
select column_name
from information_schema.columns
where table_name = #table_name and table_schema = #table_schema and
ordinal_position = #op;
You can do a group of columns with a slightly more complicated approach (because I assume ordering is important)
select group_concat(c.column_name order by cols.ordering) as columns
from (select 1 as colpos, 1 as ordering union all
select 2, 2
) cols join
information_schema.columns c
on c.ordinal_position = cols.colpos
where table_name = #table_name and table_schema = #table_schema;
Try this.
$output= $partNameWD->{'ozDa' . $ozColId};
echo $output;
Check out the PHP.net site for this
http://php.net/manual/en/language.variables.variable.php
Caution
Further dereferencing a variable property that is an array has
different semantics between PHP 5 and PHP 7. The PHP 7.0 migration
guide includes further details on the types of expressions that have
changed, and how to place curly braces to avoid ambiguity.

Categories