Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SELECT语句检索重复的结果或仅检索一行_Php_Mysql_Select_Pdo - Fatal编程技术网

Php SELECT语句检索重复的结果或仅检索一行

Php SELECT语句检索重复的结果或仅检索一行,php,mysql,select,pdo,Php,Mysql,Select,Pdo,我创建了一个orders页面,供登录用户在表中查看他们的订单。我的“SELECT”语句最初显示重复的结果,但在尝试修复它之后,它现在只显示每个用户一个订单 我有两个表格用于订单订单和订单详细信息 如何显示所有用户订单,而不是仅显示一个或多个订单 <?php //CUSTOMER $user = $_SESSION['email']; $get_c = "SELECT * FROM customer WHERE email='$user'"; $run_c = $db->query($

我创建了一个
orders
页面,供登录用户在表中查看他们的订单。我的“SELECT”语句最初显示重复的结果,但在尝试修复它之后,它现在只显示每个用户一个订单

我有两个表格用于订单
订单
订单详细信息

如何显示所有用户订单,而不是仅显示一个或多个订单

<?php
//CUSTOMER
$user = $_SESSION['email'];
$get_c = "SELECT * FROM customer WHERE email='$user'";
$run_c = $db->query($get_c);
$row_c = $run_c->fetch(PDO::FETCH_BOTH);
$c_id = $row_c['id'];

//ORDERS
$get_o = "SELECT * FROM orders WHERE user_id='$c_id'";
$run_o = $db->query($get_o);
$row_o = $run_o->fetch(PDO::FETCH_BOTH);
$o_id = $row_o['id'];/***/
$o_name = $row_o['name'];
$o_status = $row_o['status'];
$o_userid = $row_o['user_id'];
$o_date = $row_o['date'];

//ORDER DETEAILS
$get_order = "SELECT * FROM ordersdetail WHERE ordersid='$o_id' ";
$run_order = $db->query($get_order);

while($row_o = $run_order->fetch(PDO::FETCH_BOTH)){
$order_id = $row_o['ordersid'];
$o_price = $row_o['price'];
$pro_id = $row_o['productid'];
$o_qty = $row_o['quantity'];

//PRODUCT DETAILS
$get_pro = "SELECT * FROM items WHERE id='$pro_id'";
$run_pro = $db->query($get_pro);
$row_pro = $run_pro->fetch(PDO::FETCH_BOTH);
$pro_image = $row_pro['photo'];
$pro_title = $row_pro['title'];
?>

<tr align="center">
    <td><?php echo $o_id;?></td>
    <td>
    <?php echo $pro_title;?> <b>
    <img src="images/<?php echo $pro_image;?>" width="50" height="50" />
    </td>
    <td><?php echo $o_price;?></td>
    <td><?php echo $o_qty;?></td>
</tr>
<?php } ?>
</table>
订单表

`orders` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`status` tinyint(1) NOT NULL,
`user_id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE     CURRENT_TIMESTAMP
) ENGINE=InnoDB

那里有很多疑问,我不相信你需要所有的

要获取给定客户的订单,可以使用联接操作。例如:

SELECT o.id
     , o.name
     , o.user_id
     , o.date
  FROM orders o
  JOIN customer c
    ON c.id = o.user_id
 WHERE c.email =  ?     -- '$user'
 ORDER BY o.date DESC, o.id DESC
我将添加一个
orderby
子句,以使结果更具确定性。如果没有这一点,MySQL可以自由地按照它选择的任何顺序返回行

由于订单可以包含(零?)一个或多个订单行,因此连接到
ordersdetails
表将在返回的每一行上生成“重复”订单信息

这里有一个设计选择。或者

1) 我们运行orders查询,并获取循环中的每一行。对于我们获取的每一行,我们从
ordersdetails
表中运行一个单独的查询,并为行项目处理这些行。然后再次返回订单循环,获取下一个订单。上面的查询用于外部循环,类似这样的查询用于内部循环

SELECT l.ordersid
     , l.price
     , l.productid
     , l.quantity
  FROM orderdetails l
 WHERE l.ordersid = ?   -- o.id
另一个大的设计方案是只执行一个大查询,如下所示:

SELECT o.id          AS o_id
     , o.name        AS o_name
     , o.user_id     AS o_user_id
     , o.date        AS o_date
     , l.id          AS d_id 
     , l.price       AS d_price
     , l.productid   AS d_productid
     , l.quantity    AS d_quantity
  FROM orders o
  JOIN customer c
    ON c.id = o.user_id
  LEFT
  JOIN orderdetails l
    ON l.ordersid = o.id
 WHERE c.email =  ?     -- '$user'
 ORDER BY o.date DESC, o.id DESC, l.id DESC
并对其进行处理。这将需要一些额外的代码

如果我们获取的行中的o_id orderid等于上一行中的o_id,我们就知道我们正在处理相同的订单。如果我们在页面上返回这样的结果

 order#55
 date: 3/25/2016

       product            price   qty    status
       --------------   --------  ---    ----------        
   1)  snugglyfluffy       14.99   12    shipped
   2)  bitersmiter         99.95    1    fulfillment
   3)  camelmammal     14,358.00    7    backordered

 order#42
 date: 12/12/2012

       product            price   qty    status
       --------------   --------  ---    -------          
   1)  hitchhikersguide    12.50    1    shipped 
   2)  towel                4.00    1    shipped

然后,我们需要通过检查订单id中的差异来识别每个订单的“第一行”(当前行与前一行的对比。我们在获得新订单时会处理订单标题部分,然后处理行项目。在同一订单的下一行,我们只会输出另一行项目,重复该操作,直到获得新订单id。

如果不知道您的db结构,将很难提供帮助…我将导出我的表和编辑代码现在给我一个sec@Mani登录mysql shell
mysql-u您的_用户名-p
,然后键入
使用您的_DB_名称
,然后键入
show tables
查看表格。这样,您可以复制文本结构并将其粘贴到问题中。如果您想显示表格的结构,只需运行e> 描述你的表格名称。它的编辑@webenoI正在使用phpMyAdmin Mysql@James111不确定从哪里访问感谢你的帮助,第一个解决方案已经奏效,但是由于某种原因,它现在给了我三倍的结果。有什么想法吗?实际上我已经尝试了你的第二个查询,效果更好。非常感谢。
电子邮件
在客户表?我建议您在代码之外开发、测试和调试SQL语句。请确保查询返回您期望的结果。当您将这些查询引入代码中,并且从程序中获得意外结果时,您不会怀疑问题是在查询中还是在代码中。
 order#55
 date: 3/25/2016

       product            price   qty    status
       --------------   --------  ---    ----------        
   1)  snugglyfluffy       14.99   12    shipped
   2)  bitersmiter         99.95    1    fulfillment
   3)  camelmammal     14,358.00    7    backordered

 order#42
 date: 12/12/2012

       product            price   qty    status
       --------------   --------  ---    -------          
   1)  hitchhikersguide    12.50    1    shipped 
   2)  towel                4.00    1    shipped