2017-02-01 8 views
0

Я столкнулся с проблемой MySQL через этот link. Прочитав ответ ниже (также можно найти в ссылке), я все еще не понял. Может кто-нибудь объяснить шаги для меня, особенно подзапрос (SELECT @i := @i + 1 AS i, employee_id FROM employees)? Заранее спасибо!Получение нумерованных записей из таблицы сотрудников

Проблема:

Fetch четный записей из таблицы сотрудников.

Ответ:

SET @i = 0; 

SELECT i, employee_id 

FROM (SELECT @i := @i + 1 AS i, employee_id FROM employees) a 

WHERE MOD(a.i, 2) = 0; 
+0

Это выборочно задает «альтернативные» записи, т.е. половину набора данных , Они не «пронумерованы» в каком-либо значимом смысле, хотя они могут быть! – Strawberry

+0

Я думаю, что небрежные ответы, подобные этому (представляются как-то канонические), частично объясняют, почему этот сайт не рекомендуется в качестве ресурса на этом сайте. – Strawberry

ответ

2

Если вы пытаетесь получить даже пронумерованные идентификаторы сотрудников, все это не нужно

SELECT employee_id FROM employees 
WHERE employee_id%2 = 0; 

Вышеприведенный код делает Asign произвольном номера каждому сотруднику. Это то, что делает подзапрос

(SELECT @i := @i + 1 AS i, employee_id FROM employees) 

Начинает с нуля, использует счетчик, который увеличивается на единицу для каждой строки. Но, как отмечает @strawberry в комментариях, это действительно не имеет никакой цели или значения здесь. Лучше использовать employee_id (если, конечно, у вас нет странной ситуации, когда у большинства сотрудников есть либо нечетное, либо четное число, а не равное распределение)

+0

Это имеет смысл! –

+0

Рад помочь. Все самое лучшее с вашим проектом. – e4c5

1
(SELECT @i := @i + 1 AS i, employee_id FROM employees) 

Это увеличивает значение переменной i для каждой строки извлеченной (может быть любой строкой, поскольку нет никакого порядка, представленного здесь). Таким образом, значение i не будет иметь никакого значения.

Когда вы говорите четные строки, должен быть какой-то порядок нумерации. Я предполагаю employee_id в порядке возрастания здесь.

Использование пользовательских переменных в одном запросе:

SELECT 
    * 
FROM 
    (SELECT 
     e.*, @rn:=IF(@rn IS NULL, 1, @rn + 1) rn 
    FROM 
     employees e 
    ORDER BY employee_id) t 
WHERE 
    rn % 2 = 0; 
+0

Я не думаю, что это отвечает на вопрос – Strawberry

+0

Большое спасибо! Я только что видел обновления, но это очень помогает! –