查询以显示mysql中多选字段中的选定选项

时间:2017-01-21 17:01:18

标签: mysql phpbb3

我正在尝试查询工作,该查询显示来自作为phpbb论坛一部分的多选字段的特定信息。

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

我该怎么做?

为了支持多语言,配置文件字段值(TEXT)存储在_lang表中,而实际的_data表只保存到lang表的索引。因此,您可以将数据存储在数据表中,然后将其映射到"项目经理"用英语或" Gestor de Proyectos"用西班牙语......

2017-01-22:感谢输入sofar仍然在努力让查询工作。 请在下面的三个表中找到相关内容。

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(Holistische Coaching) - ............................................... - ............................................... - option_id(17)lang_value(Zingeving) - option_id(18)lang_value(Overige)

2 个答案:

答案 0 :(得分:0)

您加入表格的查询如下所示:

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

答案 1 :(得分: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);

?>