1


1

私はアルバムとMySQLのテーブルを持っています。 各アルバムは、トップレベルのアルバム、または別のアルバムの子アルバムにすることができます。 各アルバムには、その写真が入っているフォルダの名前であるフォルダ名があります。 各アルバムには、parentという名前のフィールドもあります。これは、親アルバムのIDです。 だから、私はこのような画像へのパスがある場合:

ルート/ album1 / album2 / image1.jpg

データベース内のアルバムテーブルは次のようになります。

id親フォルダ名1 NULLルート2 1アルバム1 3 2アルバム2

それでは、問題は、mysqlのみを使用してこのテーブルからパスを先に印刷する方法を教えてください。

4 回答


7


データベースにツリーを保存するのは良い考えではありません…

問題を単純にするためには、アルバムのフルパスをテーブルの列に格納するだけです。

id親パスfoldername 1 NULL / root 2 1 / root / album1 3 2 / root / album1 / album2


2


この記事では、その方法について説明します。 linky


0


まったくテストされていないし、私の頭の上から入力しています…​

DECLARE @FOLDER VARCHAR(200)DECLARE @TOPIDをINTとしてDECLARE @MYIDをintとして

CREATE TABLE #tmp([ID] INT、[パス] VARCHAR(50))

アルバムからのidを選択するためのtempCursorカーソルの宣言を拒否してください

tempCursorから@TOPIDへの次のFETCH

WHILE @@ FETCH_STATUS = 0 BEGIN SET @FOLDER = '' SET @MYID = @TOPID

WHILE @MYIDがNULLではありませんBEGIN SELECT @MYFOLDER =アルバムからのフォルダ名WHERE id = @MYID SET @FOLDER = @MYFOLDER '/' @FOLDER SELECT @MYID =親アルバムからWHERE ID = @MYID END

INSERT INTO #tmp SELECT @TOPID、@FOLDER

次のtempCursorから@TOPIDへの終わりEND CLOSE tempCursor DEALLOCATE tempCursor

SELECT * FROM #tmp DROP TABLE #tmp

これで、少なくともパス名を取得する方法がわかります。 ファイル名が保存されている場所を指定したことはありません。

ところで、これは遅くなるつもりです。 私はカーソルを使うのが嫌だ…​


0


DB2、SQL Server、PostgreSQL、およびOracleはすべて共通テーブル式(CTE)をサポートしており、これを使用してこれを実現できます。 Oracleには "CONNECT BY"キーワードもあります。

私はそれがあなたの問題を解決しないことを知っています、しかし多分それは他の誰かがMySQL以外の何かで解決策を探すのを助けるでしょう。

あなたの場合、パフォーマンスの観点から、フルパスを列に格納することをお勧めします - 挿入/更新時の非正規化データの管理は、読み取り時のパフォーマンスに何度も返済される可能性があります。