admin_id  |  country_id
-------------------------
   5            44
   5            32
   3            2
   92           32
   92           30
   5            30

Я хочу получить все значения country_id, если admin_id $_Session['admin']['id'] = 5 И все значения country_id, если admin_id = 92.

Могут быть дубликаты, потому что у многих администраторов может быть один и тот же country_id, поэтому в этом случае я хочу сохранить ТОЛЬКО country_id из admin_id=92

Желаемый результат:

admin_id  |  country_id
-------------------------
   5            44             
   92           32
   92           30

Дальнейшее объяснение:

То, что я бы на самом деле сделал вместо этого, просто сделайте расчет GCD сначала и затем рассчитать {{x0}} в конце.

-1
ssssss 11 Ноя 2020 в 20:01

2 ответа

Лучший ответ
SELECT
   admin_id,
   CASE WHEN COUNT(country_id) > 1
     THEN (select country_id from mytable WHERE admin_id=92)
     ELSE MAX(country_id) END as country_id
FROM 
   mytable
GROUP BY 
   admin_id;

Я предполагаю, что для admin_id = 92 существует только 1 страна.

Вывод выше:

+----------+-------------------+------------+
| admin_id | COUNT(country_id) | country_id |
+----------+-------------------+------------+
|        5 |                 2 |         32 |
|        3 |                 1 |          2 |
|       92 |                 1 |         32 |
+----------+-------------------+------------+

Кстати, неясно, почему admin_3 = 3 отсутствует в желаемом вами выходе.

Редактировать: После того, как вопрос изменился пару раз ... 😉:

SELECT
  admin_id,
  country_id
FROM 
  mytable
WHERE admin_id=92
UNION ALL
SELECT 
  admin_id,
  country_id
FROM 
  mytable
WHERE admin_id<>92 
  AND NOT country_id IN (SELECT country_id FROM mytable WHERE admin_id=92)
  AND admin_id<>3;

Выход:

+----------+------------+
| admin_id | country_id |
+----------+------------+
|       92 |         32 |
|       92 |         30 |
|        5 |         44 |
+----------+------------+
1
Luuk 11 Ноя 2020 в 17:36

Используйте NOT EXISTS, чтобы исключить строки admin_id = 5 с country_id, которые существуют в строках admin_id = 92:

select t.*
from tablename t
where t.admin_id = 92 
   or (
     t.admin_id = 5
     and 
     not exists (select 1 from tablename where admin_id = 92 and country_id = t.country_id)
   ) 

Для MySql 8.0+ вы можете использовать оконную функцию ROW_NUMBER():

select admin_id, country_id
from (
  select *, row_number() over (partition by country_id order by admin_id = 92 desc) rn 
  from tablename
  where admin_id in (5, 92)
) t
where t.rn = 1

См. демонстрацию.
Полученные результаты:

> admin_id | country_id
> -------: | ---------:
>        5 |         44
>       92 |         32
>       92 |         30
0
forpas 11 Ноя 2020 в 17:46