2014-02-19 3 views
0

Я пытаюсь объединить одну таблицу в другую таблицу на основе заданного значения. Но это не так просто, как ПРИСОЕДИНЕНИЕ. (Я нашел много примеров JOIN в Интернете, но таких нет. Кроме того, я не невероятно хорош в запросах DB.)MySQL Merge Table B в таблицу A на основе значений в строке таблицы B

Для простого примера того, что я пытаюсь выполнить, скажем, я запускаю компьютерный магазин и продавать несколько компьютеров нескольким людям. По какой-то причине эти машины периодически регистрируются со мной, и я хочу знать, у кого у меня есть машина, которая в настоящее время отключена. Однако, если у них есть хотя бы 1 машина в Интернете, я НЕ хочу видеть ЛЮБОЙ из машин, которые у них есть, которые либо онлайн, либо офлайн.

Мой запрос до сих пор что-то вроде этого:

SELECT * 
FROM Computers 
LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
WHERE Computers.Currently_Online LIKE "0" 

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

Вот грубый визуальное приближение моей базе данных:

Customers: 
ID  Other Stuff 


Computers_On_Customers 
ID  Customer_ID  Computer_ID 

Computers: 
ID  Currently_Online 

Любая помощь будет принята с благодарностью.

+0

Все еще борются? Рассмотрите возможность предоставления надлежащих DDL (и/или sqlfiddle) ВМЕСТЕ С ЖЕСТКОЙ РЕЗУЛЬТАТОМ – Strawberry

+0

Спасибо за помощь, ребята! Все 3 вопроса интересны и поставили меня на пути, которые кажутся хорошими. Я не уверен, какой ответ - «один истинный ответ», но я обновлю это, когда у меня его будет. Еще раз спасибо! – Dwebtron

ответ

1

Вы должны выполнить агрегацию, а затем принять результат этого объединения и выберите с помощью фильтров, которые вы хотите.

Использование вашего примера. Возьмите место и переместите его вне выбора агрегации.

SELECT 
    ID, offline_count 
from 
    (SELECT 
     Customers.ID, 
      SUM(IF(Computers.Currently_Online Like '0', 0, 1)) 'offline_count' 
    FROM 
     Computers 
    LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
    LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
    GROUP BY Customers.ID) c 
where 
    c.offline_count > 0 

Предполагая, что data_table имеет информацию, чтобы указать, находится ли пользователь в сети или в автономном режиме, и может быть несколько записей. Совокупность пользователей и сумма счетчика офлайн, если его> 0 после агрегирования, то вы знаете, что пользователь имеет автономную запись. Вы можете добиться аналогичного с предложением HAVING.

+0

Все 3 ответа были замечательными, но это действительно поставило меня на правильный путь там, где я должен был быть. Еще раз спасибо ребятам !! – Dwebtron

1

Вы можете использовать НЕ СУЩЕСТВУЕТ, чтобы отфильтровать компьютеры, владельцы которых имеют компьютер онлайн:

SELECT * FROM Computers 
    LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
    LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
WHERE 
    Computers.Currently_Online LIKE "0" AND 
    NOT EXISTS (
       SELECT 1 FROM Computers_On_Customers 
        LEFT JOIN Computers ON Computer_ID = Computers.ID 
        WHERE 
         Currently_Online LIKE "1" AND 
         Computers_On_Customers.Customer_ID = Customers.ID 
       ) 
1

Предполагая, что вы просто хотите, данные клиента - конечно, вы можете просто свернуть все это вверх с пунктом GROUP BY ... и так как вы только после записи, где максимальное значение Computers.Currently_Online = 0 вы должны быть в состоянии использовать MAX функция, чтобы исключить что-нибудь, где это значение> 0.

SELECT Customers.*, MAX(Computers.Currently_Online) AS computer_online 
FROM Customers 

INNER JOIN Computers_On_Customers 
    ON Customers.ID = Computers_On_Customers.Customer_ID 

INNER JOIN Computers 
    ON Computers_On_Customers.Computer_ID = Computers.ID 

GROUP BY Customers.ID 

HAVING computer_online = 0 

Лично мне не нравится вложенности вЫБИРАЕТ, если я абсолютно не надо ... и в тех случаях, я бы предпочел, чтобы поместить его в хранимую процедуру ,

Смежные вопросы