Mysql在一次查询中选择多行


Mysql select from multiple rows in one query

我有这个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"列只是自动增量,从mysql获取值。

列"param_name"有一些初始值(例如:ringtone, user…等)

列"param_value"动态地从"settings"表单中获取它的值,以便每个参数都有它唯一的值。

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

$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查询。

这很难以您想要的方式实现,因为所有值的列名都是相同的-但是您希望将不同的值放入特定的变量中。相反,你应该翻转桌子,使它看起来像这样

| 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和France-guy(而不会得到id: 1或greek -guy),所以如果你有很多行,你的查询应该是不同的。这是因为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列设置为数据库中唯一的,以避免变量被覆盖。

使用*选择器选择所有行。

$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'];
    }

在纠结了一会儿之后,我想到了一个可行的解决方案:

$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"}]

非常感谢大家的时间和回答。t .