Получение повторяющихся значений из оператора SELECT для PHP MySQL

В моей базе есть две таблицы: ips, oips

Поле ips.public содержит значения: 1, 2, 3, 4, 5, 6, 7, 8

Поле oips.public содержит значения: 1, 3, 7

Я хочу выбрать все значения в ips.public, которые не отображаются в oips.public

Я использую следующий запрос MySQL в PHP:

SELECT * FROM ips, oips WHERE ips_ips.public != oips.public

Это возвращает следующее:

1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8

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

Может ли кто-нибудь пролить свет на то, как получить этот код, чтобы он возвращал только значения, которых нет в обеих таблицах (иначе: 2, 4, 5, 6, 8)

Спасибо!

0

Решение

Есть несколько способов сделать это.

Я предпочитаю использовать NOT EXISTS:

SELECT *
FROM ips i
WHERE NOT EXISTS (
SELECT 1
FROM oips o
WHERE i.ipublic = o.opublic)

Вот NOT IN:

SELECT *
FROM ips
WHERE ipublic NOT IN (SELECT opublic FROM oips)

И вот LEFT JOIN/NULL:

SELECT i.*
FROM ips i
LEFT JOIN opublic o ON  i.ipublic = o.opublic
WHERE o.opublic IS NULL
0

Другие решения

«возвращать только значения, которых нет в обеих таблицах» это не то же самое, что «все значения в ips.public, которые не отображаются в oips.public».

Приведенный ниже запрос покажет вам все открытые значения, которых нет в обеих таблицах.

select public from (
select public from ips
union all
select public from oips
) t1 group by public
having count(*) = 1

Если public могут быть продублированы при каждом использовании таблицы select distinct для внутренних операторов выбора.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector