我有一个数据库表,其中包含一些足球比赛,每周3次,我在这个例子的表格中写了这些:
week |team1 |team2 |date1 |time1 |team3 |team4 |date2 |time2 |
46 |Chelsea |Man Utd |18/11 |13:30 |Arsenal|Stoke |19/11 |18:00 |
然后我有这个代码来调用它们:
"SELECT * FROM table_name WHERE week = '$week'";
... $week = Date('W');
echo $row['team1'].' - '.$row['team2'].'<br />
'.$row['team3'].' - '.$row['team4'].';
等等。但有时日期或时间会发生变化,所以我必须再次制作整行,否则它仍将首先显示第一个匹配,即使其他匹配将首先播放。让Chelea - Man Utd在18:00搬到20/11。我可以以某种方式改变行中的日期和时间,并使匹配在前端重新排列吗?
很抱歉,如果我有点难以理解我在谈论的内容:)
答案 0 :(得分:1)
首先,我认为您的表格格式不正确,您不应该有field1
,field2
,field3
等字段...如果您需要:您应该创建另一个表:D喜欢:或者你有一个逻辑问题。我认为这样的架构可以更好地添加到您的数据库中:
# table team
id | name
1 | Chelsea
2 | Man Utd
3 | Arsenal
4 | Stoke
如果团队更改此名称,则效率更高,如果值在其他表中为一次。
# table match
id | local_team_id | external_team_id | dateTime | week | score ^_^
1 | 1 | 2 | 2017-11-14 19:30:06 | 46 | 2-0
2 | 3 | 4 | 2017-11-15 18:30:21 | 46 | 2-0
另外,如果可能的话,永远不要使用SELECT * FROM your_table
无效,并且对性能非常不利。您必须在您的请求中返回PHP中所需的值。不多。
您可以在样本中写下:
"SELECT team1, team2, team3, team4 FROM table_name WHERE week='$week'"
但是,即使这样,你也可能遇到SQL injection的问题。您可以使用PHP方法或使用PDO和prepare query来修复它。使用PDO的请求样本:
$query = "SELECT team1, team2, team3, team4 FROM table_name WHERE week= :week"
$dbh->prepare($query, , array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$dbh->execute([':week' => $week]);
因此,为了回答您的问题,您可以订购结果列,并在请求中定义字段:
SELECT first, second, third FROM table_name
您可以使用ORDER BY
子句(请参阅文档here)对行结果进行排序:
SELECT team1, team2, team3, team4, week FROM table_name ORDER_BY week DESC
希望我帮助你。
答案 1 :(得分:0)
当您询问如何重新设计或查询现有数据结构时,请包括数据结构的定义(在您的情况下,CREATE TABLE语句)以及它包含的数据示例。
你的问题的标题谈论排序 - 但问题的主体是关于比赛的日期/时间如何变化。如果要控制从SQL DBMS检索行的顺序,则SQL有一个解决方案 - 在SELECT语句中指定ORDER BY clause。
但我怀疑你的问题是你将多个匹配的详细信息放在表格的一行中。这是非常错误的。
描述匹配的表格每行只能包含一个匹配项。可以说,它也不应该包含团队(因为两个团队都与匹配具有相同的物理关系,使用不同的列来保持它们会产生人为的差异)但是对于大多数目的来说这可能是过度的。
我会将其实现为:
AttributeViewModel
(根据使用情况,可能需要其他指数)。
我假设这一周可以从日期时间得出(例如,如果第40周的比赛被推迟7天,则认为是在第41周)。
如果你想显示在一周内发生的所有匹配作为前端的一行,那么,尽管可以在SELECT语句的输出中以这种方式格式化数据,你应该在PHP代码中处理它。