簡體   English   中英

MySQL:聯接兩個表並根據聯接表中的兩列填充字段

[英]MySQL: Joining two tables and populating fields according to two columns in the joined table

我正在使用現有的畫廊系統,因此我想使一些字段使用多語種(標題,來源,說明)。 獨特的表“翻譯”用於存儲這些翻譯的文本。 該表的“ lang”列存儲語言代碼(“ fr”,“ en”,“ de”)。 “ file_id”列存儲翻譯所涉及的文件。

我正在尋找MySQL中輸出一個文件及其所有列的記錄的最佳方法,包括其所有列,包括所有翻譯為列“ title_fr,title_en,...,description_de”。

表結構:

    CREATE TABLE `files` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `src` varchar(128) NOT NULL default '',
      `name` varchar(128) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    CREATE TABLE `translations` (
      `id` int(10) unsigned NOT NULL,
      `file_id` int(10) unsigned NOT NULL,
      `lang` char(2) NOT NULL default '',
      `title` varchar(255) NOT NULL default '',
      `source` varchar(32) default '',
      `description` text,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我嘗試了兩個想法,但沒有一個奏效。

1)第一個想法是使用VIEW。 由於缺少共享主機上的訪問權限而失敗:

GRANT CREATE VIEW ON *.* TO 'the-user@the-host' IDENTIFIED BY PASSWORD  'here-the-password';

CREATE VIEW French AS
  SELECT f.id, title AS title_fr, source AS source_fr, description AS description_fr
  FROM files AS f LEFT OUTER JOIN translations AS t ON t.file_id = f.id WHERE (f.id=11 AND t.lang='fr');

CREATE VIEW English AS
  SELECT f.id, title AS title_en, source AS source_en, description AS description_en
  FROM files AS f LEFT OUTER JOIN translations AS t ON t.file_id = f.id WHERE (f.id=11 AND t.lang='en');

CREATE VIEW German AS
  SELECT f.id, title AS title_de, source AS source_de, description AS description_de
  FROM files AS f LEFT OUTER JOIN translations AS t ON t.file_id = f.id WHERE (f.id=11 AND t.lang='de');

SELECT * FROM  files AS f
  LEFT OUTER JOIN French ON f.id=French.id
  LEFT OUTER JOIN English ON f.id=English.id
  LEFT OUTER JOIN German ON f.id=German.id
  GROUP BY f.id;

2) 第二個想法是通過使用數據透視表從該線程中的示例中得到的。 就我而言,我不能使用COUNT()並且以下SQL查詢無效,但給出了這個主意。 抱歉,有一些冗余。

SELECT f.*,
  (CASE
    WHEN t.`lang`='fr'
    THEN t.title
    ELSE NULL
   ) AS title_fr,
  (CASE
    WHEN t.`lang`='en'
    THEN t.title
    ELSE NULL
   ) AS title_en,
  (CASE
    WHEN t.`lang`='de'
    THEN t.title
    ELSE NULL
   ) AS title_de,
  (CASE
    WHEN t.`lang`='fr'
    THEN t.source
    ELSE NULL
   ) AS source_fr,
  (CASE
    WHEN t.`lang`='en'
    THEN t.source
    ELSE NULL
   ) AS source_en,
  (CASE
    WHEN t.`lang`='de'
    THEN t.source
    ELSE NULL
   ) AS source_de 
  (CASE
    WHEN t.`lang`='fr'
    THEN t.description
    ELSE NULL
   ) AS description_fr,
  (CASE
    WHEN t.`lang`='en'
    THEN t.description
    ELSE NULL
   ) AS description_en,
  (CASE
    WHEN t.`lang`='de'
    THEN t.description
    ELSE NULL
   ) AS description_de
FROM files AS f WHERE id=11
LEFT OUTER JOIN
translations AS t
ON f.id=t.file_id
GROUP BY id

我還閱讀了有關CONCAT和CONCAT_WS的信息,但它們並不是我想要的,因為我想使進一步的PHP處理盡可能簡單。

盡管您不能使用count ,但是可以使用max ,所以請嘗試以下查詢,它應該是您要尋找的內容:

SELECT 
  f.id, f.src, f.name,
  MAX(CASE WHEN t.lang='fr' THEN t.title ELSE NULL END) AS title_fr,
  MAX(CASE WHEN t.lang='en' THEN t.title ELSE NULL END) AS title_en,
  MAX(CASE WHEN t.lang='de' THEN t.title ELSE NULL END) AS title_de,
  MAX(CASE WHEN t.lang='fr' THEN t.source ELSE NULL END) AS source_fr,
  MAX(CASE WHEN t.lang='en' THEN t.source ELSE NULL END) AS source_en,
  MAX(CASE WHEN t.lang='de' THEN t.source ELSE NULL END) AS source_de,
  MAX(CASE WHEN t.lang='fr' THEN t.description ELSE NULL END) AS description_fr,
  MAX(CASE WHEN t.lang='en' THEN t.description ELSE NULL END) AS description_en,
  MAX(CASE WHEN t.lang='de' THEN t.description ELSE NULL END) AS description_de
FROM files AS f 
LEFT OUTER JOIN translations AS t ON f.id=t.file_id
WHERE f.id=11
GROUP BY f.id, f.src, f.name;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM