GROUP BY Несколько столбцов каждый - PullRequest
2 голосов
/ 05 марта 2019

У меня есть эта таблица:

id   | word1   | word2
1    |  100    | 200
2    |  101    | 200

Я хочу показать значения word_number только один раз, например, для текущей таблицы - вот мой ожидаемый результат:

100, 101, 200

Я пробовал это:

$stmt = $mysqli->prepare('SELECT word1, word2 FROM table GROUP BY word1, word2 ORDER BY id DESC LIMIT ?, ?');
$stmt->bind_param('ii', $start,$perpage);
$stmt->execute();

таким образом его группа только слово1, поэтому результат его:

100, 200, 101, 200

Когда я изменяю GROUP BY на word2, он правильный, но противоположный.

Еще объясните на вопрос:

id   | word1   | word2
1    |  100    | 200
2    |  101    | 200

для этой таблицы, id строка его первичный ключ, среднее значение растет каждую строку. поэтому для word1 = 100, word2 = 200 - значение id его 1 - я хочу ORDER BY эту id клавишу.

1 Ответ

1 голос
/ 05 марта 2019

Если вам не нужно, чтобы результат сортировался по идентификатору?
Тогда вы можете использовать обычный UNION с выбором для обоих полей слова.

Обычный UNION уже удаляет дубликаты, поэтому тогда ему не понадобится GROUP BY.

$stmt = $mysqli->prepare('SELECT word1 as word FROM table UNION SELECT word2 FROM table ORDER BY word DESC LIMIT ?, ?');

И если его нужно отсортировать по идентификатору, то использование UNION ALL не удалит дубликаты. Таким образом, вы можете группировать и сортировать подзапрос.

Тогда запрос может выглядеть примерно так:

SELECT word 
FROM
(
  SELECT id, word1 as word
  FROM table
  UNION ALL
  SELECT id, word2
  FROM table
) q
GROUP BY word
ORDER BY MAX(id) DESC
LIMIT ?, ?

Или используя CROSS JOIN для числового трюка.

select case n when 1 then word1 when 2 then word2 end as word
from table
cross join (select 1 n union all select 2) N
group by word
order by min(id) desc
limit ?, ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...