0

我是 sql 新手,正在构建一个 mysql 和 php 应用程序。我可能会错误地计划表格本身,如果是这样,我会感谢任何想法。

我有包含一些列的块,包括标题、文本、口号。标题和文本都比看起来更复杂,因为我需要字体、大小以及对每个文本的批准。所以我用这些列创建了一个文本表。这些是表格:

blocks
id(increment),text(texts.id),title(texts.id),slogan(texts.id),
type(enum),time(datetime),difficulty(int)

texts
id(increment),Text(text),font(varchar),size(int),approval(approval.id)

aprrovals
id(increment), User(varchar), time(datetime)

所以这里是问题:

  1. 这是保存这些信息的好方法吗?我应该让 textxs 保存它们所属的块 id 吗?
  2. 如何显示包含所有块列的表格,但显示来自 texts.Text 而不是 id 的实际文本?
  3. 如何选择特定块的特定文本的批准。用户?
4

2 回答 2

1

您的第一个问题是唯一可以真正回答的人是您,但是根据您的描述,这似乎是明智的。将列命名为“文本”并不是最好的主意,因为它是 mysql 中的保留字。您必须始终记住转义列名。我建议改用“body”之类的东西。(我相信时间和类型也是如此。)

您接下来的两个问题需要了解 JOIN。JOIN 允许您根据定义的条件将两个表连接在一起。我将以相反的顺序回答问题,因为您的第二个问题将是一个更复杂的连接。

所以 3)文本和批准它们的用户:

SELECT  
  t.`id`, t.`Text`, a.`User` 
FROM 
  texts t  
INNER JOIN
  approvals a
ON
  t.approval=a.id;

这将返回已批准的任何行的文本 ID、文本和用户名。如果您还想查看未经批准的内容,请更改INNER JOINLEFT JOIN。这将始终从 ON 语句左侧的表中返回行。

现在返回所有块的问题是您需要多次加入文本表。这使它有点复杂,但很容易做到:

SELECT 
  t1.`Text` as 'Title', 
  t2.`Text` as 'Slogan', 
  t3.`Text` as 'Body',
  b.`type` as 'Type',
  b.`time` as 'Time'
  b.`difficulty` as 'Difficulty'
FROM 
  blocks b
INNER JOIN
  texts t1
ON 
  b.`title` = t1.`id`
INNER JOIN
  texts t2
ON 
  b.`slogan` = t2.`id`
INNER JOIN
  texts t3
ON 
  b.`text` = t3.`id`;
于 2013-01-13T08:04:10.550 回答
0

如果我正确理解您的问题,我认为没有必要拥有 Approvals 表。如果一个Text可以有一个且只有一个用户批准,并且可以在一个且只有一个日期批准,则不需要单独的Approvals。

我应该让 textxs 保存它们所属的块 id 吗?

我认为这取决于您的建模需求。是不是一直是一个文字,一个标题,一个标语,三者都要填写?如果是这样,那么您是否像现在那样做也没关系。但是,如果您经常看到一个只有文本而没有标题和标语的块,则让文本引用块可能更有意义。

如何显示包含所有块列的表格,但显示来自 texts.Text 而不是 id 的实际文本?

这样的事情应该让你开始:

SELECT b.id, text.text, title.text, slogan.text, b.type, b.time, b.difficulty
FROM blocks AS b
JOIN texts AS text ON b.text = texts.id
JOIN texts AS title ON b.title = texts.id
JOIN texts AS slogan ON b.slogan = texts.id

如何选择特定块的特定文本的批准。用户?

SELECT a.user
FROM approvals AS a
JOIN texts AS t ON a.id = t.approval
JOIN blocks AS b ON b.text = t.id
WHERE b.id = idToLookFor
于 2013-01-13T07:55:38.487 回答