2014-03-07 4 views
0

я в настоящее время имеют следующие записи:SQL Заявление Позиция записи в зависимости от конкретных значений

+----+-------------+-----------------+--------+-----------------+-------------+ 
| id | postal_code | program_type_id | gender | school_location | school_type | 
+----+-------------+-----------------+--------+-----------------+-------------+ 
| 1 | 66202  |    2 | female |     |    | 
| 2 | 67487  |    2 | male | rural   | public  | 
| 3 | 68504  |    2 | female | rural   | private  | 
| 4 | 67554  |    2 | female | rural   | public  | 
| 5 | 67212  |    2 | female | urban   | public  | 
+----+-------------+-----------------+--------+-----------------+-------------+ 

У меня есть следующая запись:

mysql> select id, postal_code, program_type_id, gender, school_location, school_type from applications limit 1 offset 6; 
+----+-------------+-----------------+--------+-----------------+-------------+ 
| id | postal_code | program_type_id | gender | school_location | school_type | 
+----+-------------+-----------------+--------+-----------------+-------------+ 
| 7 | 66202  |    2 | female | urban   | public  | 
+----+-------------+-----------------+--------+-----------------+-------------+ 

у меня будет соответствовать этой записи 7 к записывает в базу данных определенным образом и дает оценки.

Scoring:

Matching POSTAL_CODE = 1000 точки Matching program_type_id = 490 точек Matching пола = 20 точки Matching school_type = 500 баллов

Теперь записи я должен извлекать должен быть в следующем порядке :

+----+-------------+-----------------+--------+-----------------+-------------+ 
| id | postal_code | program_type_id | gender | school_location | school_type | 
+----+-------------+-----------------+--------+-----------------+-------------+ 
| 1 | 66202  |    2 | male |     |    | 1K points 
| 3 | 68504  |    2 | female | rural   | private  | 520 points 
| 2 | 67487  |    1 | male | rural   | public  | 490 points 
| 4 | 67554  |    1 | female | rural   | public  | 20 points 
| 5 | 67212  |    1 | female | urban   | public  | 20 points 
+----+-------------+-----------------+--------+-----------------+-------------+ 
5 rows in set (0.00 sec) 

Обратите внимание, что 3 обогнавших 2 вызвать совпадение program_type_id и пол будет собирать 520 очков, а соответствие только school_type будет составлять всего 500 баллов. В этом случае 3 баллы выше 2 в очках.

Теперь, мой вопрос: есть ли у кого-нибудь идеи, как это сделать и как это можно сделать? Кстати, это MySQL 5.

ответ

0

Посмотрите на сазе в mysql.Your конструкции будет иметь следующий вид

select <fields that matter>, (case when tab1.program_type_id = applications.program_type_id then 490 when 
tab1.postal= applications.postal then 1000 end)from tab1, applications where 
tab1.a = applications.a or tab1.b = applications.b 

, конечно, нужно изменить имена столбцов в запросе к тем из ваших.

+0

Анализируя ответ, это может означать, что нам придется иметь дела заявление для каждой комбинации тоже. Например, program_type_id и пол будут иметь свой собственный case case. –

+0

конечно да .. но не весь регистр дела, но только когда .... затем ... часть –

0

Я хотел бы создать функцию GET_SCORE(postal_code, table_postal_code, program_type_id, table_program_type_id ...)

Внутри функции вы можете сравнить прошлые параметры и возвращать вычисленный балл.

После того как вы просто используете функцию в своем SELECT, передавая необходимые поля параметров и таблицы.

Окончательно только ORDER BY столбец результата функции.

UPDATE

DELIMITER $ 

DROP FUNCTION IF EXISTS GET_SCORE$ 

CREATE FUNCTION GET_SCORE(
    postal_code VARCHAR(255) CHARACTER SET utf8, 
    table_postal_code VARCHAR(255) CHARACTER SET utf8, 
    ... all the rest params there) 
    RETURNS INT(11) CHARACTER SET utf8 
READS SQL DATA SQL SECURITY INVOKER 
    BEGIN 
    DECLARE result INT(11); 
calculate all your comparisons and fill the score value to the result 

    RETURN result; 
    END$ 

Тогда просто позвоните

SELECT GET_SCORE(... pass proper values from necessary tables...) as score 

FROM ... the tables... 
ORDER BY score; 
+0

Это замечательно. Можете ли вы подробно остановиться на этой функции? –

+0

+1, но я использовал вышеупомянутый метод. –

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