В моей базе есть две таблицы: 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)
Спасибо!
Есть несколько способов сделать это.
Я предпочитаю использовать 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
«возвращать только значения, которых нет в обеих таблицах» это не то же самое, что «все значения в 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
для внутренних операторов выбора.