0

photos というテーブル内のすべてのレコードに対してクエリを実行し、結果の写真のどれが現在のユーザーによってブックマークされているかを 1 つのクエリで知るにはどうすればよいでしょうか?

ここに私のテーブルがあります:

--
-- Table structure for table `photos`
--

CREATE TABLE IF NOT EXISTS `photos` (
  `id` int(11) NOT NULL auto_increment,
  `author` bigint(20) NOT NULL COMMENT 'The user''s Facebook ID.',
  `filename` varchar(255) NOT NULL,
  `thumbnail` varchar(255) NOT NULL,
  `post_date` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `description` varchar(140) NOT NULL,
  `finalist` tinyint(4) NOT NULL DEFAULT '0',
  CONSTRAINT user_must_exist FOREIGN KEY (author)
    REFERENCES users(facebook_id)
    ON DELETE CASCADE,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `bookmarks`
--

CREATE TABLE IF NOT EXISTS `bookmarks` (
  `facebook_id` bigint(20) NOT NULL COMMENT 'The author''s Facebook ID.',
  `photo_id` int(11) NOT NULL,
  CONSTRAINT photo_should_exist FOREIGN KEY (photo_id)
    REFERENCES photos(id)
    ON DELETE CASCADE,
  CONSTRAINT user_should_exist FOREIGN KEY (facebook_id)
    REFERENCES users(facebook_id)
    ON DELETE CASCADE,
  UNIQUE KEY `no_duplicates` (`facebook_id`,`photo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='The user''s favourite photos.';

このクエリは次のようになると思います。

SELECT 
    photos.*, 
    bookmarks.photo_id AS bookmark 
FROM photos
LEFT JOIN bookmarks 
    ON bookmarks.photo_id = photos.id 
    AND photos.author = 123456789

ただし、これは機能せず、次の MySQL エラーが表示されます。

Unknown column 'photos.id' in 'on clause'

Keyur のコードは、Barmar が指摘したマイナーなタイプミスの修正後に機能しました。

SELECT photos . * , bookmarks.photo_id AS bookmark
FROM photos
LEFT JOIN bookmarks ON photos.id = bookmarks.photo_id
AND bookmarks.facebook_id = 123456789

ありがとうございました。

タイプミスのため編集しました。

2回目の誤字修正。

4

2 に答える 2

2

これは、 SQL Fiddleで動作するサンプル コードです。コメントで指摘されているように、テーブルにbookmarks.id列がなく、実際にbookmarksテーブルに存在します。何かが正しくないように見えるので、受け取ったエラーをもう一度確認してください。photo.idphotos

于 2012-09-13T07:43:41.510 に答える
1

クエリは次のようになります。

SELECT 
    photos.*, 
    bookmarks.id AS bookmark 
FROM photos
LEFT JOIN bookmarks 
    ON photos.id = bookmarks.photo_id 
    AND bookmarks.facebook_id = 123456789

テーブル構造に応じてphotos.facebook_id存在しません。ブックマークテーブルにあります

于 2012-09-13T07:46:35.893 に答える