2017-01-21 1 views
1

Я пытаюсь получить запрос, который показывает определенную информацию из поля mult-select, которое является частью форума phpbb.запрос для отображения выбранных параметров из поля multi select в mysql

SELECT d.pf_firstname, d.pf_lastname, d.pf_specialism 
FROM phpbb_profile_fields_data d 
WHERE d.pf_lastname = 'Linssen' 

Приведенный выше запрос дает следующий результат:

-- firstname: Pierre 
-- lastname: Linssen 
-- pf_specialism: 1;3;8;10;12;15;16 (which are the selected options) 

В другой таблице соотношение между имеющимися вариантами (от 0 до 18) и связанный с ним текст дается.

result of a "wrong" query, showing all these options

Запрос мне нужно должна показать: Имя и фамилия пользователя, и только конкретные варианты, которые пользователь (в данном случае: Linssen) выбрал для конкретного поля профиля (в данном случае : специализация).

Таким образом, результат запроса должен быть чем-то вроде

-- firstname: Pierre 
-- lastname: Linssen 
-- specialism: (1) Counseling ; (2) Executive Coaching ; (8) Oplossings gericht coachen; (10) Provocatief coachen ; (12) Sales coaching ; (15) Team coaching ; (16) Wandel coaching 

Как сделать это?

Для поддержки многоязычных значений полей профиля (ТЕКСТ) сохраняются в таблице _lang, а в фактической таблице _data содержатся только индексы к таблице lang. Так, чтобы у вас было, скажем, 3, хранящееся в таблице данных, а затем вы сопоставляете это с «Менеджером проектов» на английском языке или «Gestor de Proyectos» на испанском языке ...

2017-01-22: Спасибо за ввод sofar все еще пытается заставить запрос работать. Ниже приведены три таблицы с соответствующим содержанием.

phpbb_profile_lang имеет следующие соответствующие поля - FIELD_ID (41) - lang_id (2) - lang_name (specialisme)

phpbb_profile_fields_data имеет следующие соответствующие поля - идентификатор_пользователя (90) - pf_voornaam (Pierre) - pf_achternaam (Линссен) - pf_specialisme (1; 3; 8; 10; 12; 15; 16)

phpbb_profile_fields_lang имеет следующие соответствующие поля - FIELD_ID (41) - lang_id (2) - option_id (0) lang_value (Business Coaching) - option_id (1) lang_value (консультирование) - option_id (2) lang_value (Executive Coaching) - option_id (3) lang_value (Holistische Coaching) - ............................ ................... - ............................ ........................ - option_id (17) lang_value (Zingeving) - option_id (18) lang_value (Overige)

+0

«Специалисты' все в одной строке с запятой разделены? или они находятся в отдельных строках? – GurV

+0

Будет ли одна строка для каждого имени или нескольких строк? – GurV

+0

Специалисты (например, коучинг, консультирование, обучение) сами по себе находятся в отдельной строке, где каждый специалист имеет уникальный option_id –

ответ

0

Ваш запрос на присоединение к таблицы выглядели бы как t его:

select pf_voornaam, pf_lastname, lang_value 
from phpbb_profile_fields_data pfd 
inner join phpbb_profile_fields_lang pfl on pfl.feld_id = pfd.pf_specialisme 
inner join phpbb_profile_lang pl on pfl.lang_id = pl.lang_id; 

Если у вас есть контроль над схемой, я бы настоятельно рекомендовал изменить phpbb_profile_lang.lang_id быть первичным ключом FIELD_ID и удалить lang_id - это избыточно на основе данных, вы показали.

Основываясь на вашем примере, я использовал следующий запрос:

select pf_voornaam, pf_achternaam, pf_specialisme, lang_value 
from phpbb_profile_fields_data pfd 
inner join phpbb_profile_fields_lang pfl on pfl.field_id = pfd.pf_specialisme 
inner join phpbb_profile_lang pl on pfl.lang_id = pl.lang_id; 

Результат показан на this image

+0

в phpbb есть 3 релевантные таблицы: phpbb_profile_fields_data // phpbb_profile_fields_lang // phpbb_profile_lang –

+0

Не видя содержимого каждой таблицы, я не могу определить, какая таблица ассоциаций (если есть), но вы должны иметь возможность взять мой пример и найти, в какой таблице это, и заменить первую информацию внутреннего соединения с помощью этого – gwnp

+0

2017-01-22: Я добавил исходный вопрос с отсутствующей таблицей-информацией. –

0

При всем соответствующим входом здесь и с помощью «Javiexin», следующий MySQLi основанный на php-скрипте с различными включенными mysql-запросами сделал трюк. Я открыт для любых предложений по дальнейшему улучшению запросов и скриптов.

Адрес link to a result page.

<?php 

/*Open connection to our database. */ 

$link = mysqli_connect("localhost", "perspec1", "FLeur0798!", "perspec1"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
printf("Connect failed: %s\n", mysqli_connect_error()); 
exit(); 
} 

/* check if server is alive */ 
if (mysqli_ping($link)) { 
printf ("A: Our connection is OK!<br/><br/>"); 
} else { 
printf ("Error: %s\n", mysqli_error($link)); 
} 

/* First MYSQL query */ 
$sql = "SELECT d.pf_voornaam, d.pf_achternaam, d.pf_specialisme FROM phpbb_profile_fields_data d WHERE d.pf_achternaam = 'Linssen'"; 

if (!$sql) { echo "Error: ".mysqli_error(); die(); 
} else { 
    printf ("B: First query is successful!<br/><br/>"); 
} 

     if ($result = mysqli_query($link, $sql)) 
     { 
      echo "<table>"; 
      //header 
      echo "<tr><td>Voornaam</td>"; 
      echo "<td>Achternaam</td>"; 
      echo "<td>Specialisme</td></tr>"; 
      //data 
      while ($row = mysqli_fetch_array($result)) 
      { 
      echo "<tr><td>{$row[0]}</td>"; 
      echo "<td>{$row[1]}</td>"; 
      echo "<td>{$row[2]}</td></tr>"; 
      } 
       echo "</table><br/>"; 
     } 

/* Second MYSQL query */ 
$query2 = mysqli_query($link, $sql); 

if (!$query2) { echo "Error: ".mysqli_error(); die(); 
} else { 
printf ("C: Second query is successful!<br/><br/>"); 
} 

while($row = mysqli_fetch_assoc($query2)) 
$selected_opts = explode (";", $row['pf_specialisme']); 
foreach ($selected_opts as $selected_opt) echo "$selected_opt <br/>"; 
echo "<br/>"; 
$selected_opts_string = implode(', ', $selected_opts); 

$sql3 = "SELECT fl.option_id, fl.lang_value FROM phpbb_profile_fields f,  phpbb_profile_fields_lang fl WHERE f.field_id = fl.field_id AND f.field_name = 'specialisme' AND fl.lang_id = 1 AND fl.option_id IN ($selected_opts_string) ORDER BY fl.option_id ASC"; 
$query3 = mysqli_query($link, $sql3); 

if (!$sql3) { echo "Error: ".mysqli_error(); die(); 
} else { 
    printf ("D: Third query is successful!<br/><br/>"); 
} 

if (!$query3) { echo "Error: ".mysqli_error(); die(); } 

echo "<table>"; 
while($result = mysqli_fetch_assoc($query3)) 
{ 
echo "<tr><td>$result[option_id]</td>"; 
echo "<td>$result[lang_value]</td></tr>"; 
} 
echo "</table>"; 

mysqli_free_result($result); 
mysqli_close($link); 

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