2013-05-23 3 views
-2

Я использую sqlite3. У меня есть простая задача, и для этого мне нужно написать SQL-запрос, который можно запустить в sqlite3. Пожалуйста, обратитесь к приведенному ниже рисунку для моих выборочных данных, ожидаемого результата и необходимости запроса.Запрос, чтобы найти количество умножений в таблице

Кто-то сказал мне подсказку, чтобы использовать «группу», но я мало знаю о SQL.

enter image description here

+1

Откуда берутся эти цифры '3 * 1 + 2 * 9 + 4 * 0 ...'? пожалуйста, объясни? –

+0

эти числа соответствуют значениям столбца «count» для «term», которые являются общими для 111 и 222 –

ответ

3

Попробуйте это ..

SELECT sum(t) 
FROM 
    (SELECT f1.count*f2.count t 
    FROM fruits f1, 
     fruits f2 
    WHERE f1.term=f2.term 
    AND f1.docID=111 
    AND f2.docID=222); 

Внутренний запрос умножает count такого же term от docID = 111 и docID = 222. Внешний запрос суммирует их все.

UPDATE: Как отметил ypercube, это может быть сделано без производной таблицы, как это ..

SELECT SUM(f1.count*f2.count) total 
    FROM fruits f1, 
     fruits f2 
    WHERE f1.term=f2.term 
    AND f1.docID=111 
    AND f2.docID=222); 
+0

, откуда мы получаем tbl1? –

+0

@vidit: Что такое "tb11"? Предполагалось, что это «фрукты»? – Jonathan

+1

@ Джонатан. О, да, исправлено. Спасибо :) – vidit

1

Вот решение всех промежуточных шагов во время работы его:

Во-первых, найти все плоды с DocId 111:

SELECT term, count FROM fruits 
WHERE docID = 111; 

Затем найти все плоды с DocId 222:

SELECT term, count FROM fruits 
WHERE docID = 222; 

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

SELECT * 
FROM (SELECT term, count FROM fruits 
     WHERE docID = 111) as f1 
INNER JOIN 
    (SELECT term, count FROM fruits 
     WHERE docID = 222) as f2 
    ON f1.term = f2.term; 

Умножить два «счета» столбцы:

SELECT f1.count * f2.count as multicount 
FROM (SELECT term, count FROM fruits 
     WHERE docID = 111) as f1 
INNER JOIN 
    (SELECT term, count FROM fruits 
     WHERE docID = 222) as f2 
    ON f1.term = f2.term; 

И наконец:

Суммировать все эти столбцы вместе. Еще один концептуальный прыжок, вы обернуть весь запрос, который вы имели прежде в обертку, а затем делать то, чтобы результаты этого набора, и который дает окончательное решение:

SELECT sum(multicount) total 
FROM (
    SELECT f1.count * f2.count as multicount 
    FROM (SELECT term, count FROM fruits 
      WHERE docID = 111) as f1 
    INNER JOIN 
     (SELECT term, count FROM fruits 
      WHERE docID = 222) as f2 
     ON f1.term = f2.term; 
) as all_fruits; 

Try код: SQLFiddle

+0

Большое спасибо jonathan. Ответ настолько объяснительный, хотя я знаю 1% SQL, я могу понять. Можете ли вы сообщить мне, как я могу изменить этот запрос, когда мне нужно взять или все все docID вместо docID = 111, а docID = 222 останется таким же. На самом деле мне нужен вывод в столбцах в docID и результат. –

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