Дайте мне это соединение или это соединение (MySQL)

#mysql #join

#mysql #Присоединиться

Вопрос:

 SELECT COUNT(*) as snitch_count 
FROM snitchings 
JOIN pimps ON pimps.pimp_id=snitchings.pimp_id 
JOIN prostitutes ON prostitutes.prostitute_id=snitchings.prostitute_id 
WHERE snitchings.case_id=4538;
  

Это то, что у меня есть, и оно выполняется, но оно кажется неправильным (таблицы существуют, но пока нет тестовых / фиктивных данных, поэтому я не могу полностью знать). Я полагаю, что приведенный выше запрос вернет общую сумму стукачей для сутенеров И проституток, как пара, для данного случая (это огромные случаи). Но мне нужен запрос, чтобы вернуть общую сумму стукачей для сутенеров ИЛИ проституток. Как мне исправить этот запрос, чтобы сделать это?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я, вероятно, устал от кодирования в течение нескольких часов подряд, пожалуйста, извините меня, если мой синтаксис или объяснение немного шаткие

Комментарии:

1. Очевидно, сутенерам теперь требуется способ обращаться со своими проститутками….

2. …или ADA нужно отслеживать, скольким людям им нужно выдать ваучеры на одежду, чтобы они выглядели презентабельно в суде

3. Все шутки в сторону, я просто изменил имена таблиц и столбцов на те, что в OP, чтобы защитить свое приложение. Мне нужна помощь, чтобы заставить это работать

4. может быть, сделать это простым или надуманным примером? сутенеры, стукачи и проститутки определенно не являются подходящим надуманным примером

5. Я подумал, что, поскольку по телевизору так много полицейских и криминальных шоу, сутенеры, стукачи и проститутки — самая простая аналогия с моей установкой. Это определенно не просто, и данный пример подходит ему как перчатка

Ответ №1:

Нет, ваш запрос найдет строки в сообщениях, которые имеют действительный pimp_id И действительный prostitute_id .

Вы уверены, что вам нужно соединение? Может ли таблица snitchings иметь недопустимые значения в prostitute_id или pimp_id ? Иначе это сработало бы:

 SELECT COUNT(*) as snitch_count 
FROM snitchings 
WHERE snitches.prostitute_id IS NOT NULL OR snitches.pimp_id IS NOT NULL
  

Если вам действительно нужно соединение, и оба являются эксклюзивными (либо стукач — проститутка, ЛИБО сутенер), это должно сработать:

 SELECT COUNT(*) as snitch_count 
FROM snitchings 
LEFT JOIN pimps ON pimps.pimp_id=snitches.pimp_id 
LEFT JOIN prostitutes ON prostitutes.prostitute_id=snitches.prostitute_id 
WHERE snitchings.case_id=4538 AND 
(pimps.pimp_id IS NOT NULL OR prostitutes.prostitute_id IS NOT NULL)
  

В противном случае вам нужно считать их отдельно (но вы можете ОБЪЕДИНИТЬ и СУММИРОВАТЬ, если действительно хотите:

 SELECT COUNT(*) as snitch_count 
FROM snitchings 
JOIN pimps ON pimps.pimp_id=snitches.pimp_id 
WHERE snitchings.case_id=4538;

SELECT COUNT(*) as snitch_count 
FROM snitchings 
JOIN prostitutes ON prostitutes.prostitute_id=snitches.prostitute_id 
WHERE snitchings.case_id=4538;
  

Комментарии:

1. Хммм… похоже, что как предпоследний, так и последний запрос должны сделать свое дело. Если я использую ОБЪЕДИНЕНИЕ и СУММУ, какой запрос быстрее и эффективнее?