Reputation: 1235
I have a table like this
+----+------+
| ID | Name |
+----+------+
| 0 | Foo |
| 1 | Bar |
+----+------+
Based on the table rows I want to calculate a ranking based on each row, so that a query like
SELECT *, [calculation] AS ranking
FROM table
ORDER BY ranking DESC
would return something like
+----+------+---------+
| ID | Name | Ranking |
+----+------+---------+
| 0 | Bar | 3 |
| 1 | Foo | 1 |
+----+------+---------+
My problem is, that I need to perform multiple assignments per row without getting more columns; basically something like
@ranking:= 0
IF(Name LIKE $firstTerm, @ranking := @ranking + 1, @ranking := @ranking)
IF(Name LIKE $secondTerm, @ranking := @ranking + 1, @ranking := @ranking)
IF(Name LIKE $thirdTerm, @ranking := @ranking + 1, @ranking := @ranking)
For each row, so that in the end I have either 0, 1, 2 or 3 as one extra column for each entry in my table
EDIT: In theory a dynamically generated query like
SELECT *
FROM table
ORDER BY SUM(
CASE
WHEN
(NAME LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND NAME NOT LIKE $thirdTerm)
OR (NAME NOT LIKE $firstTerm AND NAME LIKE $secondTerm AND NAME NOT LIKE $thirdTerm)
OR (NAME NOT LIKE $firstTerm AND NAME NOT LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 1
WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name NOT LIKE $thirdTerm)
OR (Name NOT LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 2
WHEN (Name LIKE $firstTerm AND Name LIKE $secondTerm AND Name LIKE $thirdTerm) THEN 3
ELSE 0
) DESC;
would work as expected, but you can probably imagine where this is going if we have more than 3 terms!
Upvotes: 1
Views: 251
Reputation: 1035
SELECT *,
IF(Name like $firstTerm, 1, 0) +
IF(Name like $secondTerm, 1, 0) as Ranking
FROM table ORDER BY Ranking DESC;
However, if the dataset gets big, and the calculation complex, using a search engine (elasticsearch, solr) would be more efficient and more flexible.
Upvotes: 2