我是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)
以下是问题:
答案 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