2013-07-23 4 views
0

первого У меня есть таблица, которая является стержнем выглядит следующим образомзначения Count из столбца таблицы

pivot_product_Id | productsxx_Id | category_Id | subcategory_Id | color_Id 
--------------------------------------------------------------------------- 
     1   |  1  |  1 |  1   | 1 
     2   |  1  |  1 |  1   | 2 
     3   |  3  |  1 |  1   | 3 
     4   |  4  |  1 |  2   | 4 
     5   |  4  |  1 |  2   | 5 
     6   |  2  |  2 |  4   | 6 
     7   |  5  |  2 |  5   | 7 

и у меня есть таблица цветов, как этот

color_Id | color | color2 
------------------------------------------ 
    1  | black | white 
    2  | blue | orange 
    3  | white | black 
    4  | purple | black 
    5  | black | green 
    6  | red  | black 

и мой вопрос находится в рубрике ID 1 или 2 ... сколько черного цвета существует? Подсчет из цветных и цветных столбцов

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

if(isset($shoes_post_var) || isset($nightwear_post_var)|| isset($outwear_post_var)){ 

        $query3 = "SELECT count(*) 
       FROM pivot 
      JOIN category ON 
       pivot.category_Id = category.category_Id 
      JOIN subcategory ON 
       pivot.subcategory_Id = subcategory.subcategory_Id  
      JOIN color ON 
       pivot.color_Id = color.color_Id 

      JOIN productsxx ON  
       pivot.productsxx_Id = productsxx.productsxx_Id 
      WHERE 
      color IN ('$black') 
      or 
      color2 IN ('$black') 
      AND 
      category IN ('$shoes_post_var','$nightwear_post_var','$outwear_post_var') 
      GROUP BY pivot.color_Id ASC "; 
     $query5 = mysql_query($query3)or die(mysql_errno()); 
      $total = mysql_result($query5, 0); 
     echo ' '.'('.$total.')';} 
+0

Создание и отладка запроса в виде простого текста в PHPMyAdmin, MySQL консоли или ваш любимый инструмент для управления БД. ** ТОЛЬКО ПОСЛЕ ** вы получаете запрос, который работает - переместите его на php. То же самое и для вопросов - если вы спросите о mysql, удалите все, что не относится к запросу, - любой php-код в этом случае. – zerkms

+0

используя phpmyadmin, gona посмотрите на него. – samuel

+0

, а как насчет отображения * реального запроса *? – zerkms

ответ

1

Возможное решение

SELECT COUNT(*) total 
    FROM pivot 
WHERE category_id IN (1, 2) 
    AND color_id IN 
( 
    SELECT color_id 
    FROM color 
    WHERE color = 'black' 
     OR color2 = 'black' 
) 

Вот SQLFiddle демо

+0

Спасибо очень ясно – samuel

+0

@samuel Вы очень желанны. Я рад, что смогу помочь :) – peterm

+0

Вы понимаете, что суб-выбор обычно намного медленнее, чем соединение. –

0

Вы только описали две таблицы и спросили о запросе на основе этих двух таблиц. Это дело простое соединение с помощью простого выбора - и подсчета - что-то вроде этого:

SELECT count(1) 
FROM pivot 
JOIN color ON (pivot.color_id=color.color_id AND 'black' in (color.color, color.color2)) 
WHERE pivot.category_id = 1 

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

Однако ваш существующий код объединяет 5 таблиц и использует некоторые другие критерии выбора. Вам действительно нужно задать правильный вопрос. Не пытайтесь спросить одну вещь, подразумевая другую.

+1

СУБД ** имеют ** оптимизацию для 'COUNT (*)', в то время как 'COUNT (1)' будет обрабатываться как 'COUNT()', применяемый для цельного литерала '1', который просто запутан и не имеет реальную причину использования или это сделать? – zerkms

+0

Спасибо за ваш ответ – samuel

+0

@zerkms Не уверен в оптимизации для 'count (*)', но в течение последних 20 лет мне учили, что 'count (1)' быстрее. Это связано с тем, что для 'count (*)' индекса или таблицы (если индекс не существует) требуется сканирование для получения значений, а 'count (1)' user internal row id's - это быстрее. В прошлый раз, когда я сравнивал сравнение в таблице postgres со 100 миллионами строк, 'count (1)' был примерно в 5 раз быстрее, чем 'count (*)' –

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