1

私は3つのテーブル(個人、グループ、レコードレーベル)を持っており、それらの間の情報を使用して、レコードレーベル内の人々のリストを作成したいと考えています。例:companyIDが#の個人とグループを検索し、それらをリストする必要があります。結果を複製せずにこれを正しく作成するにはどうすればよいですか?

// Connect to database
include "mysqli_connect.php";

// Set variables
$url_num = $_GET['company_id'];
$company_num = "";
$company_members = "";
$company_members2 = "";

//Check for artist id pagination
if(is_numeric($url_num)){
    $company = intval($url_num);
}else{
    $company = 1;
}

// Construct our join query
$sqli = "SELECT DISTINCT * FROM recordlabels
INNER JOIN individuals ON individuals.companyID=recordlabels.companyID
INNER JOIN groups ON groups.companyID=recordlabels.companyID
WHERE recordlabels.companyID = '{$company}'";

// Create results
$result = mysqli_query($link, $sqli);

//Check for albums
$totalmembers = mysqli_num_rows($result);

// Checking if query is successful
if($result){

// Print out the contents of each row into a table 
while($row = mysqli_fetch_array($result, MYSQLI_BOTH)){

// Assign value of column if not empty, otherwise "DamJuNoImage" (Thanks to Jonathan Sampson from Stack Overflow)
    $companyen = empty( $row["companyen"] ) 
        ? "Unknown" 
        : $row["companyen"];
    $companyko = empty( $row["companyko"] ) 
        ? "Unknown" 
        : $row["companyko"];
    $companyType = empty( $row["companyType"] ) 
        ? "Unknown" 
        : $row["companyType"];
    $founded = empty( $row["established"] ) 
        ? "Unknown" 
        : $row["established"];
    $founder = empty( $row["companyFounder"] ) 
        ? "Unknown" 
        : $row["companyFounder"];
    $information = empty( $row["information"] ) 
        ? "Unknown" 
        : $row["information"];
    $location = empty( $row["companyLocation"] ) 
        ? "Unknown" 
        : $row["companyLocation"];
    $homepage = empty( $row["companyPage"] ) 
        ? "#" 
        : $row["homepage"];
    $solopic = empty( $row["solopic"] ) 
        ? "DamjuNoImage" 
        : $row["solopic"];
    $soloen = empty( $row["soloen"] )
        ? "Unknown"
        : $row["soloen"];
    $solokn = empty( $row["solokn"] )
        ? "Unknown"
        : $row["solokn"];
    $grouppic = empty( $row["grouppic"] ) 
        ? "DamjuNoImage" 
        : $row["grouppic"];
    $groupen = empty( $row["groupen"] )
        ? "Unknown"
        : $row["groupen"];
    $groupkn = empty( $row["groupkn"] )
        ? "Unknown"
        : $row["groupkn"];
    $company_members .= '<li><a href="#">
      <div class="image"><img src="pathhere/' . $solopic . '"></div>
      <p class="datatitle2">' . $soloen . '</p>
      <p class="data-info2">' . $solokn . '</p>
      </a></li>';
    $company_members2 .= '<li><a href="#">
      <div class="image"><img src="pathhere' . $grouppic . '"></div>
      <p class="datatitle2">' . $groupen . '</p>
      <p class="data-info2">' . $groupkn . '</p>
      </a></li>';
    $listofmembers = $company_members . $company_members2; 
} // End of while statement
}else{
    echo "No people under $companyen";
} // End of If statement

(うまくいけば)より良い視覚を与えるため。

  • ボブ(個人)
  • リサ(個人)
  • マニア(グループ)

助けを求める前の私のテストはこの結果をもたらしました:

  • ボブ(個人)
  • リサ(個人)
  • マニア(グループ)
  • マニア(グループ)

それは、個人とグループのアウトプットをそれぞれ別の価値に置いたからです。$var1 . $var2それから私は私がうまくいかないと感じたエコーをしました。

更新:誰もそれを理解できない場合は、データベースとテーブルをやり直します。あなたが助けようとしたすべてに感謝します。

4

1 に答える 1

1

この問題は、SQL コードに起因する可能性が最も高いです。companyId具体的には、 との両方individual group、外部キーindividualを持つ非正規化があるようです。groupId

この関係を考えると、おそらく次の行に沿ってステートメントを書きたいと思うでしょう:

SELECT companyEn, companyKo, companyType, established, companyFounder, 
       information, companyLocation, companyPage,
       soloPic, soloEn, soloKn, 
       groupPic, groupEn, groupKn
FROM recordLabels
JOIN groups 
ON groups.companyId = recordLabels.companyId
JOIN individuals
ON individuals.groupId = groups.groupId
WHERE recordLabels.companyId = $company

その他の注意事項:
私が聞いたところによると、ベスト プラクティスでは通常、複数形ではなく単数形の名前をテーブルに付けます。および列
はどうなっていますか? 国際化(英語と韓国語?)を行っているように思えます-もしそうなら、元のテーブルからそれらの列を抽出し、翻訳テーブルを開始したいと思うでしょう。これは、後で他の言語のサポートを追加する必要がある場合に非常に役立ちます。....En...Ko


編集:

変換テーブルを処理する方法は複数ありますが、おそらく、変換されたデータを必要とするテーブルごとに 1 つの変換テーブルが必要です。また、参照用に標準言語テーブルも必要になるでしょう。

language
============
id  -- autoincrement - or possibly just use code
code  -- ISO 3-letter code, unique
shortCode  -- ISO 2-letter code, unique (I think?)
name  -- ISO standard name

recordLabelとして:

1) 翻訳する必要があるすべての列を含む翻訳済みテーブルを作成します。

recordLabelTranslation
=====================
companyId  -- fk to recordLabel.companyId, or whatever the primary key of that table is
languageId  -- fk to language.id
company  -- whatever 'companyEn' and 'companyKo' was (company name?  why translate?)

2) 翻訳されたすべての列を削除します ( companyEncompanyKo)

3) (オプション) 簡単に参照できるようにビューをコーディングします。次の 2 つのフレーバーがあります。

-> 言語の単純な結合

CREATE VIEW Record_Label_Language as 
SELECT recordLabel.companyId, recordLabel.information, -- all current columns...
       recordLabelTranslation.languageId, recordLabelTranslation.company
FROM recordLabel
JOIN recordLabelTranslation
ON recordLabelTranslation.companyId = recordLabel.companyid

-> 言語に参加、デフォルトは英語 (または他の言語)

CREATE VIEW Record_Label_Language_Default as 
SELECT recordLabel.companyId, recordLabel.information, -- all current columns...
       COALESCE(recordLabelTranslation.languageId, language.languageId),
       COALESCE(recordLabelTranslation.company, dflt.company)
FROM recordLabel
JOIN recordLabelTranslation as dflt
ON dflt.companyId = recordLabel.companyid
AND dflt.languageId = [englishLanguageId]
CROSS JOIN language
LEFT JOIN recordLabelTranslation
ON recordLabelTranslation.companyId = recordLabel.companyId
AND recordLabelTranslation.languageId = language.id
于 2012-06-14T15:43:27.643 に答える