Get the number of keywords

Suppose I have the data below, the last keyword is nothing more than a combination of the other 4 columns.

╔════╦══════╦════════════╦═════════╦════════════╦════════════════════════════════╗ β•‘ ID β•‘ Name β•‘ Add1 β•‘ Add2 β•‘ Add3 β•‘ Keyword β•‘ ╠════╬══════╬════════════╬═════════╬════════════╬════════════════════════════════╣ β•‘ 1 β•‘ John β•‘ W Brown St β•‘ Edison β•‘ Washington β•‘ JohnW Brown StEdisonWashington β•‘ β•‘ 2 β•‘ Paul β•‘ E High Rd β•‘ Peapack β•‘ New Jersey β•‘ PaulE High RdPeapackNew Jersey β•‘ β•‘ 3 β•‘ John β•‘ Greams Rd β•‘ Peapack β•‘ Washington β•‘ JohnGreams RdPeapackWashington β•‘ β•šβ•β•β•β•β•©β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• 

Now the user can enter any text field Name, Add1, Add2, Add3 and click on search, and he must search in all fields.

For this, I'm trying to do it,

 SELECT *, COUNT(ID) AS FREQUENCY FROM TABA WHERE ID IN ( (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%') ) GROUP BY ID ORDER BY FREQUENCY 

Expected Result:

 ╔════╦══════╦════════════╦═════════╦════════════╦═══════════╗ β•‘ ID β•‘ Name β•‘ Add1 β•‘ Add2 β•‘ Add3 β•‘ Frequency β•‘ ╠════╬══════╬════════════╬═════════╬════════════╬═══════════╣ β•‘ 3 β•‘ John β•‘ Greams Rd β•‘ Peapack β•‘ Washington β•‘ 3 β•‘ β•‘ 1 β•‘ John β•‘ W Brown St β•‘ Edison β•‘ Washington β•‘ 2 β•‘ β•‘ 2 β•‘ Paul β•‘ E High Rd β•‘ Peapack β•‘ New Jersey β•‘ 1 β•‘ β•šβ•β•β•β•β•©β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β• 

But I get all frequency values ​​as 1. What am I doing wrong?

+7
sql sql-server
source share
3 answers

The part ... WHERE ID IN ( ...) ... will just check yes or no, but you want a count. This must be done using JOIN.

Try the following:

 SELECT TABA.*, COUNT(sub.ID) AS FREQUENCY FROM TABA JOIN ( (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%') ) sub ON sub.ID=TABA.ID GROUP BY TABA.ID ORDER BY FREQUENCY 
+3
source share

Why not make a simplified version without these subqueries:

 SELECT ID, Name, Add1, Add2, Add3, COUNT(*) AS FREQUENCY FROM TABA WHERE ID IN (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%' OR KEYWORD LIKE '%JOHN%' OR KEYWORD LIKE '%PEAPACK%') GROUP BY ID, Name, Add1, Add2, Add3 ORDER BY 6 

'Order by 6' means the sixth item in the selection area, which is the frequency

+1
source share
 SELECT TABA.*, sub.FREQUENCY FROM ( SELECT ID, COUNT(*) as FREQUENCY FROM ( (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%') UNION ALL (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%') ) a GROUP BY ID ) sub INNER JOIN TABA ON sub.ID=TABA.ID ORDER BY FREQUENCY DESC 

sql script

0
source share

All Articles