1

我正在处理这个问题。有表orders( oid, datetime, quantity, title, username, mid)。

就特性, , ,而言,该表orders是从 php 代码更新的。问题是我想根据日期时间和用户名对每个条目进行分类,以便在订单代码下收集这些条目,以便进行订购条目。(我暂时想不出其他任何东西)。问题是如何选择与相同用户名和相同日期时间对应的那些条目。oiddatetimequantitytitleusername

例如,如果我有 3 个条目(freddo espresso、latte、freddoccino)属于相同的订单程序(由相同的用户名发布,日期时间完全相同),我需要将它们作为完整的订单呈现给我的用户。

这是表的结构orders

CREATE TABLE IF NOT EXISTS `orders` (
`oid` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`datetime` DATETIME NOT NULL,
`quantity` INT NOT NULL,
`sum` FLOAT(4,2) NOT NULL,
`title` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL,
`username` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL,
`mid` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`oid`),
KEY `username`(`username`,`mid`,`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10000; 

功能标题是表中的外键products

CREATE TABLE IF NOT EXISTS `products`(
`title` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL, 

`descr` TEXT(255),
`price` FLOAT(4,2) NOT NULL,
`popularity` INT NOT NULL,
`cname` VARCHAR(20)  COLLATE utf8_unicode_ci NOT NULL, 
`mid` VARCHAR(30) COLLATE utf8_unicode_ci NOT NULL , 
PRIMARY KEY(`title`),
KEY `cname` (`cname`, `mid`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10000;

对不起,如果我有点不全面,虽然我真的需要一些帮助才能得出结论。有任何想法吗?提前致谢!

4

4 回答 4

0

如果您知道datetime值和username值是什么,那么您可以简单地使用:

SELECT * FROM orders WHERE username = '$username' AND datetime = '$datetime'

但是,您最好将其拆分为两个单独的表;就像是:

Orders
    OrderID
    OrderTime
    UserName

Items
    ItemID
    OrderID
    Title

然后,您将通过以下方式进行搜索:

SELECT Orders.OrderID, Orders.UserName, Items.Title
FROM Orders
INNER JOIN Items ON Orders.OrderID = Items.OrderID
WHERE
    Orders.UserName = '$username'
  AND
    Orders.OrderDate = '$datetime'

添加订单时,您首先添加一条记录Orders,然后使用该记录OrderID并将其添加到插入的每个项目中Items...

插入示例

$mysqli;   //Assuming your connection to the database...
$items;    //Assuming an array of items for the order like: array('Coffee', 'Tea')
$username; //Assuming the user name to be inserted for the order

$mysqli->query("INSERT INTO Orders(`OrderTime`, `UserName`) VALUES(NOW(), '$username')");
$orderid = $mysqli->insert_id;
foreach($items as $item){
    $mysqli->query("INSERT INTO Items (`OrderID`, `Title`) VALUES($orderid, '$title')");
}

注意:您应该确保在插入数据库之前清理数据......


存储 JSON

存储JSON在数据库中将要求您确保使用适当长度的字段数据类型(例如 a blob)。

您提到您titles从表单中检索 为数组,所以我现在将其称为$titles.

保存到数据库

$username      = '...';                // Username or id to store in database with order
$titles        = array(.....);         // Array of titles from form
$encodedTitles = json_encode($titles); // Convert to JSON

$mysqli->query("INSERT INTO table_name (titles_field, username_field, date_field) VALUES ('$titles', '$username', NOW())"); // Save to database (assuming already open connection

从数据库中检索

$result = $mysqli->query("SELECT titles FROM table_name WHERE username = 'username_value' AND date_field = 'date_value'"); //Run query to get row
$row    = $result->fetch_assoc();      // Fetch row
$titles = json_decode($row['titles']); // This is the same as the `titles` array from the from above!
于 2013-09-25T21:23:44.703 回答
0
SELECT quantity,title
FROM orders
WHERE username = ? and datetime = ?

将在特定日期返回特定用户的项目数量。您可以使用订单 ID 而不是日期,这可能更安全一些。如果您使用订单 ID,那么用户名也变得无关紧要,因为订单 ID 应该是唯一的。

于 2013-09-25T21:05:54.797 回答
0

我认为此查询将返回一种数据,其中您具有相同unique_id字符串的记录的位置usernamedatetime位置相同。

SELECT MD5(a.unique_id), b.* FROM (
    SELECT 
        GROUP_CONCAT(oid) unique_id, `datetime`, username 
        FROM `orders` GROUP BY username, `datetime`

) a
RIGHT JOIN `orders` b 
ON a.`datetime` = b.`datetime` AND a.username = b.username
ORDER BY unique_id, oid;

我也有大约 3000 个字符长的另一个答案,但我认为这个变体比我的长篇教程如何将表拆分为两个表以及如何将数据迁移到其中 + php 代码示例更能帮助您。所以我决定不发表。)))

编辑:我认为您甚至可以运行这个最简单且运行速度更快的查询:

SELECT *, MD5( CONCAT( `username` , `datetime` ) ) unique_id
FROM `orders`
ORDER BY unique_id, oid;
于 2013-09-25T23:36:09.847 回答
0

随查询发布的答案将对您有所帮助,但您还应该考虑更改表结构。看起来您可以有一个名为 orders 的表和另一个名为 orders_items 的表。然后,您可以列出 orders_itens 中与单个订单匹配的所有项目。

于 2013-09-25T21:13:19.417 回答