Sql表有3列第二个表ID

时间:2013-01-13 07:45:44

标签: php mysql sql database

我是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. 如何选择批准。特定块的特定文本的用户?

2 个答案:

答案 0 :(得分:1)

你的第一个问题是唯一能够真正回答这个问题的人就是你,但是根据你的描述,这似乎是明智的。命名列“Text”不是最好的主意,因为它是mysql中的保留字。你必须永远记得逃避列名。我会建议像“身体”这样的东西。 (我相信时间和类型也是如此。)

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

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

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

这将返回已批准的任何行的文本ID,文本和用户名。如果您还想查看未经批准的广告,请将INNER JOIN更改为LEFT 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`;

答案 1 :(得分:0)

如果我正确理解您的问题,我认为没有必要获得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