如何在MySQL / PHP中选择特定条目

时间:2013-09-25 20:45:34

标签: php mysql select

我正在处理这个问题。表ordersoiddatetimequantitytitleusernamemid)。

表格orders已根据功能oiddatetimequantitytitleusername从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;

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

4 个答案:

答案 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

在数据库中存储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_idusername相同的记录具有相同的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;