0

私は次のmysqlテーブルを持っています:

CREATE TABLE Articles (
   ArticleID SMALLINT NOT NULL PRIMARY KEY,
   ArticleTitle VARCHAR(60) NOT NULL,
   Copyright YEAR NOT NULL
)
ENGINE=INNODB;


INSERT INTO Articles VALUES (12786, 'How write a paper', 1934),
                            (13331, 'Publish a paper', 1919),
                            (14356, 'Sell a paper', 1966),
                            (15729, 'Buy a paper', 1932),
                            (16284, 'Conferences', 1996),
                            (17695, 'Journal', 1980),
                            (19264, 'Information', 1992),
                            (19354, 'AI', 1993);


CREATE TABLE Authors (
   AuthID SMALLINT NOT NULL PRIMARY KEY,
   AuthorFirstName VARCHAR(20),
   AuthorMiddleName VARCHAR(20),
   AuthorLastName VARCHAR(20)
)
ENGINE=INNODB;


INSERT INTO Authors VALUES (1006, 'Henry', 'S.', 'Thompson'),
                           (1007, 'Jason', 'Carol', 'Oak'),
                           (1008, 'James', NULL, 'Elk'),
                           (1009, 'Tom', 'M', 'Ride'),
                           (1010, 'Jack', 'K', 'Ken'),
                           (1011, 'Mary', 'G.', 'Lee'),
                           (1012, 'Annie', NULL, 'Peng'),
                           (1013, 'Alan', NULL, 'Wang'),
                           (1014, 'Nelson', NULL, 'Yin');


CREATE TABLE AuthorArticle (
   AuthID SMALLINT NOT NULL,
   ArticleID SMALLINT NOT NULL,
   PRIMARY KEY (AuthID, ArticleID),
   FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
   FOREIGN KEY (ArticleID) REFERENCES Articles (ArticleID)
)
ENGINE=INNODB;


INSERT INTO AuthorArticle VALUES (1006, 14356), 
                              (1008, 15729), 
                              (1009, 12786), 
                              (1010, 17695),
                              (1011, 15729), 
                              (1012, 19264), 
                              (1012, 19354), 
                              (1014, 16284);

次に、クエリを実行して、3つのテーブルすべてからデータをフェッチします。私の質問は次のとおりです。

SELECT ArticleTitle, Copyright, CONCAT_WS(' ', AuthorFirstName, AuthorMiddleName, AuthorLastName) AS Author
FROM Articles AS b STRAIGHT_JOIN AuthorArticle AS ab STRAIGHT_JOIN Authors AS a
WHERE b.ArticleID=ab.ArticleID AND ab.AuthID=a.AuthID AND Copyright<1980
ORDER BY ArticleTitle;

だから私の質問は、これがCakePHP2+でどのように達成されるかということです。どんな助けでもありがたいです...

4

1 に答える 1

1

私は自分の質問に答えることはできますが、ある程度までは、つまり、複数のテーブルを結合しますが、「STRAIGHT_JOIN」で結合することはできません。だから私の解決策は以下の通りです:

$art = $this->Article->find('all', array('joins' => array(
    array(
        'table' => 'authorarticle',
        'alias' => 'AuthArt',
        'type' => 'inner',
        'foreignKey' => false,
        'conditions'=> array('AuthArt.ArticleID = Article.ArticleID')
    ),
    array(
        'table' => 'authors',
        'alias' => 'Author',
        'type' => 'inner',
        'foreignKey' => false,
        'conditions'=> array('AuthArt.AuthID = Author.AuthID')
        )
    ), 'fields'=>array('Article.ArticleTitle','CONCAT_WS(" ", Author.AuthorFirstName, Author.AuthorMiddleName, Author.AuthorLastName) As AuthorName','Article.Copyright'), 'conditions' => array('Article.Copyright' => 1980)));
$this->set('articles', $art); // debug($articles) in the view to get results

それが同じものを探している他の誰かを助けることを願っています。私自身の質問に対する私自身の解決策が良いか、それともCAKEPHPの方法で最良の結果を得るためにさらに最適化できるかどうか、コミュニティから聞きたいです。ありがとう

于 2012-12-24T05:13:01.073 に答える