我正在处理这个问题。表orders
(oid
,datetime
,quantity
,title
,username
,mid
)。
表格orders
已根据功能oid
,datetime
,quantity
,title
,username
从php代码更新关心。问题是我想根据日期时间和用户名对每个条目进行分类,以便在订单代码下收集这些条目,以便进行订购输入。 (此刻我想不出任何其他事情)。
问题是如何选择对应于相同用户名和相同日期时间的条目。
例如,如果我有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;
对不起如果我有点不太全面,虽然我真的需要一些帮助才能得出结论。有任何想法吗? 提前谢谢!
答案 0 :(得分:0)
SELECT quantity,title
FROM orders
WHERE username = ? and datetime = ?
将在特定日期返回特定用户的项目数量。您可以使用订单ID代替日期,这可能会更安全一些。如果您使用订单ID,那么用户名也会变得无关紧要,因为订单ID应该是唯一的。
答案 1 :(得分:0)
随查询发布的答案对您有所帮助,但您还应考虑更改表格结构。看起来你可以有一个名为orders的表,另一个名为orders_items。然后,您可以列出匹配单个订单的orders_itens中的所有itens。
答案 2 :(得分: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
将要求您确保使用适当长度的字段数据类型(例如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!
答案 3 :(得分:0)
我认为此查询会返回一种数据类型,其中unique_id
和username
相同的记录具有相同的datetime
字符串。
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;
我还有大约3千个字符长的另一个答案,但我认为这个变体将比我的长篇教程更有助于你如何将表拆分为两个表以及如何将数据迁移到它+ php代码示例。所以我决定不公开它。 )))
编辑:我认为你甚至可以运行这个最简单且速度更快的查询:
SELECT *, MD5( CONCAT( `username` , `datetime` ) ) unique_id
FROM `orders`
ORDER BY unique_id, oid;