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. これはこの情報を保持するための良い方法ですか?textxにそれらが属するブロックIDを保持させる必要がありますか?
  2. ブロックのすべての列を含むテーブルを表示するにはどうすればよいですか?ただし、IDの代わりにtexts.Textから実際のテキストを表示しますか?
  3. 承認を選択するにはどうすればよいですか。特定のブロックの特定のテキストのユーザーですか?
4

2 に答える 2

1

あなたの最初の質問は、それを本当に答えることができる唯一の人があなたであるというものですが、あなたが説明することから、これは賢明であるように思われます。列に「テキスト」という名前を付けることは、mysqlで予約語であるため、最善のアイデアではありません。列名をエスケープすることを常に忘れないでください。代わりに「body」のようなものを提案します。(時間と種類も同じだと思います。)

次の2つの質問では、JOINを理解する必要があります。JOINを使用すると、定義した基準に基づいて2つのテーブルを結合できます。2番目の質問はより複雑な結合になるため、質問には逆の順序で回答します。

したがって、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`;
于 2013-01-13T08:04:10.550 に答える
0

あなたの質問を正しく理解していれば、承認テーブルを用意する必要はないと思います。テキストに1人のユーザーだけが承認でき、1日だけの日付で承認できる場合は、承認を分離する必要はありません。

textxにそれらが属するブロックIDを保持させる必要がありますか?

それはあなたのモデリングのニーズに依存すると思います。それは常に1つのテキスト、1つのタイトル、1つのスローガンであり、3つすべてに記入する必要がありますか?もしそうなら、あなたが今やったようにそれをするかどうかは問題ではありません。ただし、テキストのみでタイトルとスローガンがないブロックが頻繁に表示される場合は、テキストでブロックを参照する方が理にかなっている場合があります。

ブロックのすべての列を含むテーブルを表示するにはどうすればよいですか?ただし、IDの代わりにtexts.Textから実際のテキストを表示しますか?

このような何かがあなたを始めるはずです:

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 に答える