Mysql从一个查询中的多行中选择

时间:2015-09-29 21:58:06

标签: php mysql mysqli

我有这个Mysql数据库表(存储我的应用程序的一些设置):

Table name: settings

id    param_name    param_value
--------------------------------
1     ringtone      12.mp3
2     user          nick
3     email         nick@example.com
4     location      Athens, Greece
5     phone         0123456789
6     time_offset   GMT+3

" id" column只是自动增量并从mysql获取值。

列" param_name"有一些初始值(如:铃声,用户......等)

列" param_value"从"设置动态获取它的值"形式,以便每个参数都具有它的唯一值。

我想用一个查询选择这些所有行,并将它们中的每一个变成一个变量,例如:

$this_ringtone = "12.mp3";
$this_user = "nick";
$this_email = "nick@example.com";
$this_location = "Athens, Greece";
$this_phone = "0123456789";
$this_time_offset = "GMT+3";

我可以通过多个查询来实现这一点,但由于行实际上更多,我更喜欢单个mysqli查询。

3 个答案:

答案 0 :(得分:1)

这很难实现您想要的方式,因为列的名称对于所有值都是相同的 - 但是您需要将不同的值放入特定变量中。你应该翻转表格,所以它看起来像这样

| ID  | ringtone | user | email            | location | phone | time_offset |
+-----+----------+------+------------------+----------+-------+-------------+
|  1  | 12.mp3   | nick | nick@example.com | Greece   | 12345 | UTC+3       |
|  2  | 25.mp3   | joe  | joe@example.com  | France   | 54321 | UTC+3       |
+-----+----------+------+------------------+----------+---------------------+

您现在可以使用下面的代码

$result = mysqli_query($link, "SELECT * FROM table");
while ($row = mysqli_fetch_assoc($result)) {
    $id             = $row['id'];
    $ringtone       = $row['ringtone'];
    $user           = $row['user'];
    ...
    ...
    $time_offset    = $row['time_offset'];
}

......等等。这是因为您根据列的名称获取单元格的值,在您的情况下,这些只是param_nameparam_value。所以你真的不知道什么时候你应该把它放到正确的变量中,除非表是静态的(永远不会改变,所以你可以硬编码 - 不好的做法)或者每个用户总共有6行 - 但是如果这样的话在这种情况下,无论如何,你都可以更轻松地完成上面所示的结构。

注意如果你有不同的值行与上面的结构,你只能用这种方式获得最后一行(因为我们选择所有内容,并将其放入每行的变量)。所以对于这个例子,你只得到id: 2和法国人(而不是id: 1或希腊人,所以如果你有很多行,你的查询应该是不同的。这是因为id: 2是表格中的最后一行。

更优雅的是,你可以像这样使用PHP函数extract()

$result = mysqli_query($link, "SELECT * FROM table");
$row = mysqli_fetch_assoc($result);
extract($row); // Extract the values of the array into a variable of its own
echo $user; // Name of variable is the same as the column in the database

希望这为你的表结构看起来提供了一些明确的指导。

<强>更新
是的,所以无论出于什么原因,你想要上面的表结构,使用变量,你只需要一个查询。像这样的东西

$values = array();
$result = mysqli_query($link, "SELECT * FROM table");
while ($row = mysqli_fetch_assoc($result)) {
    ${$row['param_name']} = $row['param_value'];
}
echo $ringtone;

这会在$row['param_name']中创建一个名称为值的变量,该变量的值为$row['param_value']。实际上比我想象的要容易得多。

如果您希望变量名称为$this_name,只需使用${"this_".$row['param_name']} = $row['param_value'];

即可

您应该在数据库中将param_name列设置为 unique ,以避免变量被覆盖。

答案 1 :(得分:0)

只需使用* selector ..

选择所有行
$link = mysqli_connect("localhost", "my_user", "my_password", "database");
$result = mysqli_query($link, "SELECT * FROM table");
while($row= mysqli_fetch_array($result,MYSQLI_ASSOC){
       $ringtone = $row['ringtone'];
       $user = $row['user'];
}

如果你想把它们构建成一个数组..

$one = array();

$link = mysqli_connect("localhost", "my_user", "my_password", "database");
    $result = mysqli_query($link, "SELECT * FROM table");
    while($row= mysqli_fetch_array($result,MYSQLI_ASSOC){
           $one['ringtone'] = $row['ringtone'];
           $one['user'] = $row['user'];
    }

答案 2 :(得分:0)

经过多次努力,我找到了一个有效的解决方案:

$conn = mysqli_connect("localhost", "my_user", "my_pass", "database");
$query = mysqli_query($link, "SELECT * FROM settings");

$result = array();
while($row1 = mysqli_fetch_row($query)){
    $param_name = $row1[2];
    $query2 = mysqli_query($conni, "SELECT `param_value` FROM ".DB_TABLE_PREFIX."settings WHERE param_name = '$param_name' ");
    $row2 = mysqli_fetch_assoc($query2);
    $result[] = array($param_name => $row2["param_value"]);
}
echo json_encode($result);

现在,我得到了这个我可以在我的应用程序中使用的数组:

[{"ringtone":"12.mp3"},{"user":"nick"},{"email":"nick@example.com"},{"location":"Athens, Greece"},{"phone":"0123456789"},{"time_offset":"GMT+3"}]

非常感谢您的时间和答案。吨。