如何做 MySQL 加入并使用 PHP 来获取值
How to do MySQL Join and use PHP to get the values
我正在尝试编写一个 mysql 查询以提取这种格式的数据:
<table>
<caption>table title and/or explanatory text</caption>
<thead>
<tr>
<th>User ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Field Name 1</th>
<th>Field Name 2</th>
<th>Field Name 3</th>
<th>Field Name 4</th>
<th>Field Name 5</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($query)) {
echo "<tr>
<td>" .$row{'user_id'}. "</td>
<td>" .$row{'first_name'}. "</td>
<td>" .$row{'last_name'}. "</td>
<td>" .$row{'field_name_1'}. "</td>
<td>" .$row{'field_name_2'}. "</td>
<td>" .$row{'field_name_3'}. "</td>
<td>" .$row{'field_name_4'}. "</td>
<td>" .$row{'field_name_5'}. "</td>
</tr>";
}
?>
</tbody>
</table>
数据库中的表格式如下。
Table: user_data
user_id | first_name | last_name |
------------------------------------------------------
1 | Jeff | Smith |
------------------------------------------------------
2 | Bob | Smith |
------------------------------------------------------
3 | Steve | Smith |
------------------------------------------------------
4 | Mary | Smith |
------------------------------------------------------
5 | Anna | Smith |
------------------------------------------------------
Table: custom_fields
custom_field_id | name |
-------------------------------------
3 | field name |
-------------------------------------
5 | field name |
-------------------------------------
7 | field name |
-------------------------------------
9 | field name |
-------------------------------------
11 | field name |
-------------------------------------
Table: custom_field_data
user_id | custom_field_id | value |
------------------------------------------------------
1 | 3 | XXXX |
------------------------------------------------------
1 | 5 | BBBB |
------------------------------------------------------
1 | 7 | CCCC |
------------------------------------------------------
1 | 9 | ZZZZ |
------------------------------------------------------
1 | 11 | YYYY |
------------------------------------------------------
2 | 3 | XXXX |
------------------------------------------------------
2 | 5 | BBBB |
------------------------------------------------------
2 | 7 | CCCC |
------------------------------------------------------
2 | 9 | ZZZZ |
------------------------------------------------------
3 | 3 | XXXX |
------------------------------------------------------
3 | 5 | BBBB |
------------------------------------------------------
3 | 9 | ZZZZ |
------------------------------------------------------
3 | 11 | YYYY |
------------------------------------------------------
我正在寻找查询数据然后使用 PHP 或 AJAX 将其打印到屏幕上的最佳解决方案。这可能吗?使用 json 会更好吗?
一个示例查询会很棒。
仅供参考:在较长的 运行 中,所有提取的数据都需要在屏幕上进行过滤。感谢您的帮助。
我想要的输出是
user_id | first_name | last_name | custom_field_3 | custom_field_5 | custom_field_7 | custom_field_9 | custom_field_11 |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | Jeff | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2 | Bob | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
3 | Steve | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
4 | Mary | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
5 | Anna | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
我认为最好的方法是使用 join,因为它会减少 DB 和 PHP
之间传输的数据大小
您可以使用 JSON,因为它重量轻。
您可以将隐藏的内容保留在隐藏字段中,并完全用于客户端的进一步过滤
更新--
对于 Sql 服务器,我会编写这样的查询
select
t1.user_name,
t1.first_name,
t1.last_name,
(select name from custom_fields
where custom_field_id= t2.custom_field_id)
from
user_data t1 left join
custom_field_data t2 on t1.user_id=t2.userid
根据我的改这个-sql
让我们从 custom_field_data
到 user_data
table 的简单连接开始,其中值和字段名称是硬编码的:
SELECT
u.*,
f1.value as "<Field 1 Name>",
...
f2.value as "<Field N Name>"
FROM
user_data u LEFT JOIN
custom_field_data f1 ON u.user_id = f1.user_id AND f1.custom_field_id = 1
LEFT JOIN
custom_field_data f ON u.user_id = fn.user_id AND fn.custom_field_id = <N>
现在,如果您想在不进行硬编码的情况下提取数据,则需要根据 custom_fields
table:
中的数据动态构建 SQL
SELECT * FROM custom_fields;
如果您的某些自定义字段从未在与用户相关的情况下使用过,您可能希望像这样限制自定义字段的数量:
SELECT * FROM custom_fields f
WHERE EXISTS
(SELECT * FROM custom_field_data
WHERE f.custom_field_id = custom_field_id)
最后,要在 PHP 中构建所需的 SQL,您需要这些字符串部分:
// Begin SELECT clause (static):
$sql = "SELECT u.*,"
// Add all fields that you selected form the custom_fields:
foreach ($result as $row) { // Don't forget to handle commas
$sql = $sql + <expression that gets codes and name>
}
// Start FROM clause (static):
$sql = $sql + " FROM user_data u "
// Join to custom_field_data:
foreach ($result as $row) {
$sql = $sql + " LEFT JOIN custom_field_data <alias expression> ON ..
}
最后你应该得到一个带有 SQL 的字符串,它将把用户加入到每个可用自定义字段的 custom_field_data
。
可以使用 $.ajax()
和 PHP
提取数据。创建文件 data.php
我们将使用 ajax
加载此文件。在您的 data.php
文件中写入此代码。
$query = mysqli_query("select * from custom_field_data
inner join
user_data on user_data.user_id = custom_field_data.user_id
inner join
custom_fields on custom_field_data.custom_field_id = custom_fields.custom_field_id");
<table>
<caption>table title and/or explanatory text</caption>
<thead>
<tr>
<th>User ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Field Name 1</th>
<th>Field Name 2</th>
<th>Field Name 3</th>
<th>Field Name 4</th>
<th>Field Name 5</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($query)) {
echo "<tr>
<td>" .$row{'user_id'}. "</td>
<td>" .$row{'first_name'}. "</td>
<td>" .$row{'last_name'}. "</td>
<td>" .$row{'field_name_1'}. "</td>
<td>" .$row{'field_name_2'}. "</td>
<td>" .$row{'field_name_3'}. "</td>
<td>" .$row{'field_name_4'}. "</td>
<td>" .$row{'field_name_5'}. "</td>
</tr>";
}
?>
</tbody>
在您的主页中使用 button
加载数据。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#load-data').click(function(){
$.post('data.php', function(data){
$('#results').html(data);
});
});
});
</script>
您可以将 group_concat
函数 https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat 与我之前的查询一起使用,以便为每个用户获取一条记录...
如果你有 SQLfiddle,我可以测试一下,但我没有任何数据可以测试...
select ud.firstname, ud.lastname, group_concat(cf.name)
from user_data as ud
join custom_field_data as cfd
on cfd.user_id = ud.user_id
join custom_fields as cf
on cf.custom_field_id = cfd.custom_field_id
我用类似的设置在 3 个表上测试了它,所以我认为它应该可以工作;名称可能需要调整。
更新:
select ud.firstname, ud.lastname, group_concat(cf.name)
from user_data as ud
join custom_field_data as cfd
on cfd.user_id = ud.user_id
join custom_fields as cf
on cf.custom_field_id = cfd.custom_field_id
group by ud.user_id
我正在尝试编写一个 mysql 查询以提取这种格式的数据:
<table>
<caption>table title and/or explanatory text</caption>
<thead>
<tr>
<th>User ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Field Name 1</th>
<th>Field Name 2</th>
<th>Field Name 3</th>
<th>Field Name 4</th>
<th>Field Name 5</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($query)) {
echo "<tr>
<td>" .$row{'user_id'}. "</td>
<td>" .$row{'first_name'}. "</td>
<td>" .$row{'last_name'}. "</td>
<td>" .$row{'field_name_1'}. "</td>
<td>" .$row{'field_name_2'}. "</td>
<td>" .$row{'field_name_3'}. "</td>
<td>" .$row{'field_name_4'}. "</td>
<td>" .$row{'field_name_5'}. "</td>
</tr>";
}
?>
</tbody>
</table>
数据库中的表格式如下。
Table: user_data
user_id | first_name | last_name |
------------------------------------------------------
1 | Jeff | Smith |
------------------------------------------------------
2 | Bob | Smith |
------------------------------------------------------
3 | Steve | Smith |
------------------------------------------------------
4 | Mary | Smith |
------------------------------------------------------
5 | Anna | Smith |
------------------------------------------------------
Table: custom_fields
custom_field_id | name |
-------------------------------------
3 | field name |
-------------------------------------
5 | field name |
-------------------------------------
7 | field name |
-------------------------------------
9 | field name |
-------------------------------------
11 | field name |
-------------------------------------
Table: custom_field_data
user_id | custom_field_id | value |
------------------------------------------------------
1 | 3 | XXXX |
------------------------------------------------------
1 | 5 | BBBB |
------------------------------------------------------
1 | 7 | CCCC |
------------------------------------------------------
1 | 9 | ZZZZ |
------------------------------------------------------
1 | 11 | YYYY |
------------------------------------------------------
2 | 3 | XXXX |
------------------------------------------------------
2 | 5 | BBBB |
------------------------------------------------------
2 | 7 | CCCC |
------------------------------------------------------
2 | 9 | ZZZZ |
------------------------------------------------------
3 | 3 | XXXX |
------------------------------------------------------
3 | 5 | BBBB |
------------------------------------------------------
3 | 9 | ZZZZ |
------------------------------------------------------
3 | 11 | YYYY |
------------------------------------------------------
我正在寻找查询数据然后使用 PHP 或 AJAX 将其打印到屏幕上的最佳解决方案。这可能吗?使用 json 会更好吗? 一个示例查询会很棒。
仅供参考:在较长的 运行 中,所有提取的数据都需要在屏幕上进行过滤。感谢您的帮助。
我想要的输出是
user_id | first_name | last_name | custom_field_3 | custom_field_5 | custom_field_7 | custom_field_9 | custom_field_11 |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | Jeff | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2 | Bob | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
3 | Steve | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
4 | Mary | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
5 | Anna | Smith | XXXX | BBBB | CCCC | ZZZZ | YYYY |
-------------------------------------------------------------------------------------------------------------------------------------------------------------
我认为最好的方法是使用 join,因为它会减少 DB 和 PHP
之间传输的数据大小您可以使用 JSON,因为它重量轻。
您可以将隐藏的内容保留在隐藏字段中,并完全用于客户端的进一步过滤
更新--
对于 Sql 服务器,我会编写这样的查询
select
t1.user_name,
t1.first_name,
t1.last_name,
(select name from custom_fields
where custom_field_id= t2.custom_field_id)
from
user_data t1 left join
custom_field_data t2 on t1.user_id=t2.userid
根据我的改这个-sql
让我们从 custom_field_data
到 user_data
table 的简单连接开始,其中值和字段名称是硬编码的:
SELECT
u.*,
f1.value as "<Field 1 Name>",
...
f2.value as "<Field N Name>"
FROM
user_data u LEFT JOIN
custom_field_data f1 ON u.user_id = f1.user_id AND f1.custom_field_id = 1
LEFT JOIN
custom_field_data f ON u.user_id = fn.user_id AND fn.custom_field_id = <N>
现在,如果您想在不进行硬编码的情况下提取数据,则需要根据 custom_fields
table:
SELECT * FROM custom_fields;
如果您的某些自定义字段从未在与用户相关的情况下使用过,您可能希望像这样限制自定义字段的数量:
SELECT * FROM custom_fields f
WHERE EXISTS
(SELECT * FROM custom_field_data
WHERE f.custom_field_id = custom_field_id)
最后,要在 PHP 中构建所需的 SQL,您需要这些字符串部分:
// Begin SELECT clause (static):
$sql = "SELECT u.*,"
// Add all fields that you selected form the custom_fields:
foreach ($result as $row) { // Don't forget to handle commas
$sql = $sql + <expression that gets codes and name>
}
// Start FROM clause (static):
$sql = $sql + " FROM user_data u "
// Join to custom_field_data:
foreach ($result as $row) {
$sql = $sql + " LEFT JOIN custom_field_data <alias expression> ON ..
}
最后你应该得到一个带有 SQL 的字符串,它将把用户加入到每个可用自定义字段的 custom_field_data
。
可以使用 $.ajax()
和 PHP
提取数据。创建文件 data.php
我们将使用 ajax
加载此文件。在您的 data.php
文件中写入此代码。
$query = mysqli_query("select * from custom_field_data
inner join
user_data on user_data.user_id = custom_field_data.user_id
inner join
custom_fields on custom_field_data.custom_field_id = custom_fields.custom_field_id");
<table>
<caption>table title and/or explanatory text</caption>
<thead>
<tr>
<th>User ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Field Name 1</th>
<th>Field Name 2</th>
<th>Field Name 3</th>
<th>Field Name 4</th>
<th>Field Name 5</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($query)) {
echo "<tr>
<td>" .$row{'user_id'}. "</td>
<td>" .$row{'first_name'}. "</td>
<td>" .$row{'last_name'}. "</td>
<td>" .$row{'field_name_1'}. "</td>
<td>" .$row{'field_name_2'}. "</td>
<td>" .$row{'field_name_3'}. "</td>
<td>" .$row{'field_name_4'}. "</td>
<td>" .$row{'field_name_5'}. "</td>
</tr>";
}
?>
</tbody>
在您的主页中使用 button
加载数据。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#load-data').click(function(){
$.post('data.php', function(data){
$('#results').html(data);
});
});
});
</script>
您可以将 group_concat
函数 https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat 与我之前的查询一起使用,以便为每个用户获取一条记录...
如果你有 SQLfiddle,我可以测试一下,但我没有任何数据可以测试...
select ud.firstname, ud.lastname, group_concat(cf.name)
from user_data as ud
join custom_field_data as cfd
on cfd.user_id = ud.user_id
join custom_fields as cf
on cf.custom_field_id = cfd.custom_field_id
我用类似的设置在 3 个表上测试了它,所以我认为它应该可以工作;名称可能需要调整。
更新:
select ud.firstname, ud.lastname, group_concat(cf.name)
from user_data as ud
join custom_field_data as cfd
on cfd.user_id = ud.user_id
join custom_fields as cf
on cf.custom_field_id = cfd.custom_field_id
group by ud.user_id