Я пытаюсь найти правильный синтаксис для SQL-запроса с использованием PHP (на сайте drupal), но мне нужны некоторые рекомендации.
Вот моя идея (в модуле Drupal — уже разработан). Пользователь делает выбор из многостраничной формы (3 страницы, переключатели на каждой странице, допускается только 1 выбор на странице). Я хочу, чтобы они были отправлены в базу данных и чтобы рекомендации базы данных MySQL возвращались для пользователя в зависимости от того, какими были их выборы, ранжированные в порядке того, сколько их выборов соответствуют этим критериям в ресурсах в базе данных. Так, например, пользователь может выбрать начинающий для уровня опыта и основатель для роли и entrepreneuralship (составленное слово) в качестве интересующих их тем (3 вопроса в форме).
Если бы у ресурса в базе данных было все 3 из этих наборов для этих полей (как часть списка полей), мы бы хотели, чтобы он возвращался в верхней части результатов (если бы более 1 имели все 3, мы бы хотели, чтобы они были упорядочены в алфавитном порядке — по возрастанию), за которыми следуют любые ресурсы, которые имеют по крайней мере 2 из этих совпадающих терминов списка (с соответствующим алфавитным ранжированием между этими ресурсами второго уровня), за которыми следуют элементы, которые соответствуют только ОДНОМ из отмеченных элементов. Элементы, которые возвращают 0 совпадений, не должны отображаться вообще.
Что я сделал, так это собрал концепцию на основе кода Drupal и PHP, я надеюсь получить обратную связь по этому вопросу. Код ниже — это функция, которая вызывается после того, как пользователь отправляет форму и перенаправляется на /recommendations
стр. Что я хотел бы услышать в первую очередь, так это установить переменные PHP вверху, SQL в моем $result
Вар, который является моим лучшим предположением, как это будет работать, а затем куча if/while
операторы, чтобы сделать упорядочение и возврат данных на экран.
Любая помощь в создании этого более функционального кода будет принята с благодарностью. Спасибо!
function pathfindertool_recommendations_page() {
$output = '';
$level = $_SESSION['level'];
$level = mysql_real_escape_string($level);
$role = $_SESSION['role'];
$role = $level = mysql_real_escape_string($role);
$topic = $_SESSION['topic'];
$topic = mysql_real_escape_string($topic);
$result = db_query("SELECT n.nid, n.title, n.type, fdb.body_value, fdfe.field_experience_level_value, fdfi.field_icon, fdfl.field_link_url, fdfr.field_role_value, fdft.field_topics_value FROM {node} as n INNER JOIN {field_data_body} as fdb INNER JOIN {field_data_field_experience} as fdfe INNER JOIN {field_data_field_icon} as fdfi INNER JOIN {field_data_field_link} as fdfl INNER JOIN {field_data_field_role} as fdfr INNER JOIN {field_data_field_topics} as fdft on n.nid = fdb.entity_id on n.nid = fdfe on n.nid = fdfi on n.nid= fdfl on n.nid = fdfr on n.nid = fdft WHERE n.type = :type", array(':type' => 'resource',) "AND fdfe.field_experience_level_value = :level", array(':level' => '$level',) "AND fdfr.field_role_value = :role", array(':role' => '$role',) AND fdft.field_topics_value = :topic", array(':topic' => '$topic',) ORDER BY ASC);
if($result) {
while ($row = $result->fetchAssoc()) {
// If all three match
while (($row['field_data_experience_level'] = $level) && ($row['field_data_field_role'] = '$role') && ($row['field_data_field_topics'] = $topic)) {
$title = row['title'];
$link = row['field_data_field_link'];
$body = row['body_value'];
$icon = row['field_icon'];
$output .= '<p> . $title . <br> . $icon . <br> . $body . <br> . $link';
return $output;
}
// If at least two match
while (($row['field_data_experience_level'] = $level) && ($row['field_data_field_role'] = '$role') OR ($row['field_data_field_topics'] = $topic)) {
$title = row['title'];
$link = row['field_data_field_link'];
$body = row['body_value'];
$icon = row['field_icon'];
$output .= '<p> . $title . <br> . $icon . <br> . $body . <br> . $link';
return $output;
}
while (($row['field_data_experience_level'] = $level) OR ($row['field_data_field_role'] = '$role') && ($row['field_data_field_topics'] = $topic)) {
$title = row['title'];
$link = row['field_data_field_link'];
$body = row['body_value'];
$icon = row['field_icon'];
$output .= '<p> . $title . <br> . $icon . <br> . $body . <br> . $link';
return $output;
}
// Just if only one matches
while (($row['field_data_experience_level'] = $level) OR ($row['field_data_field_role'] = '$role') OR ($row['field_data_field_topics'] = $topic)) {
$title = row['title'];
$link = row['field_data_field_link'];
$body = row['body_value'];
$icon = row['field_icon'];
$output .= '<p> . $title . <br> . $icon . <br> . $body . <br> . $link';
return $output;
}
}
}
Вот мой SQL:
$result = db_query("SELECT n.nid,
n.title,
n.type,
fdb.body_value,
fdfe.field_experience_level_value,
fdfi.field_icon,
fdfl.field_link_url,
fdfr.field_role_value,
fdft.field_topics_value
FROM {node} AS n
INNER JOIN {field_data_body} AS fdb
INNER JOIN {field_data_field_experience} AS fdfe
INNER JOIN {field_data_field_icon} AS fdfi
INNER JOIN {field_data_field_link} AS fdfl
INNER JOIN {field_data_field_role} AS fdfr
INNER JOIN {field_data_field_topics} AS fdft ON n.nid = fdb.entity_id ON n.nid = fdfe ON n.nid = fdfi ON n.nid= fdfl ON n.nid = fdfr ON n.nid = fdft
WHERE n.type = :type
",
array(':type' => 'resource',) "AND fdfe.field_experience_level_value = :level", array(':level' => '$level',) "AND fdfr.field_role_value = :role", array(':role' => '$role',) AND fdft.field_topics_value = :topic", array(':topic' => '$topic',) ORDER BY ASC);
Задача ещё не решена.
Других решений пока нет …