2017-01-21 18 views
1

phpbbフォーラムの一部であるマルチセレクトフィールドから特定の情報を表示するクエリを取得しようとしています。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

私は必要なクエリが表示されるはずです:FirstNameおよびユーザーの姓と(この場合は: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 

のようなものでなければなりませんか?

マルチ言語をサポートするために、プロファイルフィールド値(TEXT)は_langテーブルに格納され、実際の_dataテーブルはlangテーブルのインデックスのみを保持します。例えば、データテーブルに格納された3つのデータを「Project Manager」(英語)または「Gestor de Proyectos」(スペイン語)にマッピングすると、...

2017-01-22:ありがとうございます依然としてクエリを機能させるのに苦労しています。 下記の3つの表と関連するコンテンツをご覧ください。

phpbb_profile_langは、以下の関連フィールドを有する - FIELD_ID(41) - LANG_ID(2) - LANG_NAME(specialisme)

phpbb_profile_fields_data有する下記関連項目 - USER_ID( 90) - pf_voornaam(ピエール) - pf_achternaam(Linssen) - pf_specialisme(1; 3; 8; 10; 12; 15; 16)

phpbb_profile_fields_langは、以下の関連フィールドを有する - FIELD_ID(41) - LANG_ID(2) - option_id(0)lang_value(ビジネスコーチング) - option_id(1)lang_value(カウンセリング) - option_id( 2)lang_value(エグゼクティブコーチング) - option_id(3)lang_value(ホリスティックコーチング) - ............................ ................... - ............................ ................... - option_id(17)lang_value(Zingeving) - option_id(18)lang_value(その他)

+0

は、セミコロンで区切られた 'specialism'sが1行にまとめられていますか?またはそれらは別々の行にありますか? – GurV

+0

それぞれの名前または複数の行に1つの行が存在しますか? – 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; 

、私は強く、主キーFIELD_IDこととLANG_IDを削除するphpbb_profile_lang.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; 

結果はここに関連するすべての入力とし、「Javiexin」、次mysqliのの助けを借りてthis image

+0

phpbbには3つの関連テーブルがあります:phpbb_profile_fields_data // phpbb_profile_fields_lang // phpbb_profile_lang –

+0

各テーブルの内容を見ることなく、関連テーブル(もしあれば)を特定することができませんが、テーブルを見つけ、最初の内部結合の情報をそのテーブルに置き換えます – gwnp

+0

2017-01-22:最初の質問に不足しているテーブル情報を追加しました。 –

0

に示されていますさまざまなmysqlクエリが含まれているPHPベースのPHPスクリプトがこのトリックでした。私は、クエリとスクリプトをさらに改善するための提案をお待ちしています。

ここには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); 

?> 
関連する問題