2015-11-07 2 views
1

Я разрабатываю функцию назначения для заказов, и я пытаюсь назначить заказ пользователю, у которого есть наименее ожидающие запросы. Я хочу получить идентификатор пользователя, где значение для ожидания является наименее из всех пользователей.Выберите значение SQL из столбца, где отдельный столбец равен MIN()

Пример:

userID pending 
------ ------- 
0   3 
1   0 <----This user has the least pending of all 
2   4 

Как настроить SQL-запрос, чтобы вернуть идентификатор пользователя с наименьшим количеством ожидающих запроса таблицы?

$sql="SELECT user_id FROM writerdata_tb WHERE pending = '//Minimum pending here//' LIMIT 1"; 
$assign = $conn->query($sql); 
$row = $assign->fetch_assoc(); 
+4

'ORDER BY в ожидании ASC' и чем этот предел 1 – Terminus

+0

I thinl вы можете иметь больше чем один, на самом деле, нет? –

+0

Что случилось, если 2 пользователя с 0 ожидающими? выбрать все из них или только один? –

ответ

0

Вы можете заказать результаты по колонку ожидающих (см комментарий Симоны Nigro для запроса). Используя ограничение , в результате вы получите только первую строку, в этом случае вы получите результат с минимальным ожидающим значением.

Я вижу теперь случай Александар Миладиновича, если в таблице много строк с одинаковым значением ожидающих: вы можете выполнить:

  1. запроса, чтобы получить значение mininium из в ожидании колонка
  2. Используйте значение, полученное на предыдущей стадии, чтобы получить строки с этим значением

    ВЫБОР user_id оТ writerdata_tb ГДЕ ожидающий = (SELECT мин (в ожидании) FROM writerd ata_tb)

+0

Я помню, как я читал что-то на вложенных запросах, я предполагаю, что если использовать LIMIT, он должен возвращать только одно значение из любого метода, который я использую? И будет ли проще выбирать всех пользователей и заказывать их, ожидая значения возрастания и использовать значение первого, так как оно будет самым низким? – trecoolable

0

Попробуйте так: выберите идентификатор_пользователь из writerdata_tb, где в ожидании = (выберите мин (в ожидании) от writerdata_tb);

0

Если иденты повторяются

SELECT 
    t.userID 
from 
    tasks as t 
group by (t.userID) 
order by sum(pending) asc 
limit 1 

еще

SELECT 
    t.userID 
from 
    tasks as t 
order by pending asc 
limit 1 
1

Сравнение различных вариантов ответов предложил:

EXPLAIN SELECT aa.userId, aa.pending 
FROM writerdata_tb AS aa 
INNER JOIN writerdata_tb AS bb 
ON aa.userId = bb.userId 
WHERE aa.pending >= bb.pending 
ORDER BY aa.pending ASC 
LIMIT 1; 

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE aa ALL  PRIMARY  NULL NULL NULL 4 Using temporary; Using filesort 
1 SIMPLE bb ALL  PRIMARY  NULL NULL NULL 4 Using where; Using join buffer (Block Nested Loop) 

EXPLAIN SELECT userId, pending 
FROM writerdata_tb 
WHERE pending = (
    SELECT MIN(pending) 
    FROM writerdata_tb 
); 

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  writerdata_tb ALL  NULL NULL NULL NULL 4 Using where 
2 SUBQUERY writerdata_tb ALL  NULL NULL NULL NULL 4 NULL 

EXPLAIN SELECT userId, pending 
FROM writerdata_tb 
ORDER BY pending ASC 
LIMIT 1; 

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE writerdata_tb ALL  NULL NULL NULL NULL 4 Using filesort 

EXPLAIN SELECT t.userId 
FROM writerdata_tb AS t 
GROUP BY (
    t.userId 
) 
ORDER BY SUM(pending) ASC 
LIMIT 1; 

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE t index PRIMARY  PRIMARY  4 NULL 4 Using temporary; Using filesort 
Смежные вопросы