2013-07-18 3 views
0

Я стараюсь получить подсчет всех недостающих переводов и получить действительно потерянные в том, как это сделать.mysql select total, которых не существует

Таблица:

  • языки (LANGUAGE_ID, имя)
  • продуктов (product_id)
  • product_translations (product_id, LANGUAGE_ID, имя)

Администратор получает очень ленивой, и я хотите, чтобы у них было показано, сколько переводов отсутствует.

Я думаю, что очень просто было сделать это, чтобы просто получить общее количество (languages-> count * products-> count), но я хотел бы вернуть счет для каждого продукта отдельно.

ответ

1

Чтобы сделать такой запрос, начните с таблицы driver (подзапрос), которая имеет все комбинации. Затем удалите те, которые имеют перевод:

select driver.* 
from (select distinct l.language_id, p.product_id 
     from languages l cross join 
      products p 
    ) driver left outer join 
    translations t 
    on t.language_id = driver.language_id and 
     t.product_id = driver.product_id 
where t.language_id is null; 

Это использует left outer join, который держит все в driver таблице. Если совпадения нет, то столбцы в translations будут NULL - статья where сохраняет только эти.

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

В качестве примечания: это мой предпочтительный способ написать запрос, потому что я думаю, что это самое ясное в намерении. Но MySQL фактически реализует подзапрос. Таким образом, более эффективно, если столбцы уникальны в двух справочных таблицах:

select l.*, p.* 
from languages l cross join 
    products p left outer join 
    translations t 
    on t.language_id = l.language_id and 
     t.product_id = p.product_id 
where t.language_id is null; 
Смежные вопросы