I want the table to sort LIKE queries result first then follow by other result.
Example: data = 'United States', 'New Zealand', 'South Korea'
Query:
SELECT *
FROM table
WHERE data LIKE %Korea%;
Output: 'South Korea'
Expected output: 'South Korea', 'United States', 'New Zealand'
I've researched on many places, somehow CHARINDEX its not working, neither is LOCATE (Only shows data 'South Korea'). Database Server - MySQL
CodePudding user response:
The WHERE
is restricting what is returned. It looks like you want it all returned but ordered in a certain way. Not tested:
SELECT * FROM table
ORDER BY CASE WHEN data LIKE %Korea% THEN 1 ELSE 2
This might also work:
SELECT * FROM table
ORDER BY IF(data LIKE %Korea%, 1, 2)
For both, when data
contains Korea
it is ordered before everything else. You could add , data
to then order the remaining data
ascending or descending.
CodePudding user response:
As it was already said, it's more SQL than PHP. Then, you want all rows, so WHERE gets in the way.
One way I tested is:
SELECT *, INSTR(data, 'Korea') as weight
FROM table
ORDER BY weight = 0, weight;
This will sort first by the presence of 'Korea' in data
(weight is zero if 'Korea' is absent), then by the position of 'Korea' in data
.
Using LOCATE is the same as INSTR, but the arguments are reversed:
SELECT data, LOCATE('Korea', data) as weight
FROM table
ORDER BY weight = 0, weight;