У меня есть таблица, настроенная как следующая
ID COL1 COL2 COL3 ---------------- 10 200 n/a 125 11 150 130 n/a 12 100 300 200 13 500 n/an/a
Помимо идентификатора, все столбцы TEXT.
Используя PHP и MySQL, мне нужно выбрать минимальный «номер» из COL1, COL2, COL3, в этом случае это будет 100 (из строки 12, COL1).
Я попробовал это:
$query = ("SELECT MIN(LEAST(COL1,COL2,COL3)) FROM rug AS 'query1'");
но я думаю, что что-то не так с MIN (LEAST, а также с AS 'query1'). Я получаю предупреждение:
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource
Есть предположения? Благодаря!
Я обнаружил две ошибки.
1. SQL
Ваш запрос работает для вашего конкретного примера, но попробуйте использовать меньшее число в COL2
или COL3
, после чего вы обнаружите, что он не предоставляет результаты, которые вы ищете.
Попробуйте это вместо этого:
SELECT LEAST( MIN(COL1), MIN(COL2), MIN(COL3) ) FROM yourtable;
2. PHP
Чтобы использовать mysql-запрос в php, пожалуйста, ознакомьтесь с руководством по тому, как это можно заархивировать, а ваш пример – не так, как это делается. Если ваша строка запроса хранится в $SQL
, она может выглядеть так:
/* querying... */ $result = mysql_query($SQL); /* handling possible errors */ if (!$result) { die('Invalid query: ' . mysql_error()); } /* handling the response */ while ($row = mysql_fetch_assoc($result)) { var_dump($row); }
Я подозреваю, что использование метода LEAST
приведет к сканированию таблиц. Вы можете разбить его вручную (очевидно, я ожидаю, что индексы будут присутствовать на COL1
, COL2
и COL3
):
SELECT ID, VALUE FROM ( SELECT ID, COL1 AS VALUE FROM MYTABLE ORDER BY COL1 ASC LIMIT 1 UNION SELECT ID, COL2 AS VALUE FROM MYTABLE ORDER BY COL2 ASC LIMIT 1 UNION SELECT ID, COL3 AS VALUE FROM MYTABLE ORDER BY COL3 ASC LIMIT 1 ) ORDER BY VALUE ASC LIMIT 1
Я не мог получить меньше всего (мин (чтобы возвращать любые результаты, а не так, как я хотел это сделать, но я, наконец, сделал часть работы в MySQL и частично в php). Выбрал min из каждой строки, отфильтровал пустые результаты (он вернулся n / a как пустой), а затем использовал PHP для сортировки и получения самого низкого значения.
$query = ("SELECT LEAST(COL1,COL2,COL3) FROM rug WHERE COL1 != '' AND COL2!= '' AND COL3 != ''"); $result=mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } $num=mysql_numrows($result); $i=0; while ($i < $num) { $pricing[$i]=mysql_result($result, $i); $i++; } sort($pricing); $lowest_price = $pricing[0]; //lowest price