2015-05-27 181 views
1

我有一個左連接給我許多結果的挑戰。我想在比賽中列出獲勝者。在我的獲獎者桌上,我有身份證,比賽,圖片,地點,已發佈。我感謝我能得到的任何幫助! :-)左連接 - 許多結果返回

$ id返回當前比賽ID。

在我的例子中,winners表只有3行,但返回9行。

這裏是我的查詢:

$sql = "SELECT 
      photocontest_winners.id, 
      photocontest_winners.contest, 
      photocontest_winners.image, 
      photocontest_winners.place, 

      photocontest_entries.id, 
      photocontest_entries.contest, 
      photocontest_entries.name, 
      photocontest_entries.title, 
      photocontest_entries.image 

     FROM photocontest_winners 

     LEFT JOIN photocontest_entries ON photocontest_winners.contest = photocontest_entries.contest 

     WHERE photocontest_winners.contest = $id AND photocontest_winners.published = 1 
     ORDER BY photocontest_winners.place"; 

$result = $conn->query($sql); 

while($row = $result->fetch_assoc()) { 

    echo("<pre>"); 
    print_r($row); 
    echo("</pre>"); 

} 

下面的例子輸出(我不明白爲什麼每個圖像具有INT 1,2 & 3「到位」,因爲我不喜歡衝擊片雷管在數據庫中:

Array 
(
    [id] => 1 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 1 
    [name] => Daniel 
    [title] => aar 
) 
Array 
(
    [id] => 3 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 1 
    [name] => Peter 
    [title] => Andet billede 
) 
Array 
(
    [id] => 4 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 1 
    [name] => Lucas 
    [title] => Andet billede test 
) 
Array 
(
    [id] => 1 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 2 
    [name] => Daniel 
    [title] => aar 
) 
Array 
(
    [id] => 3 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 2 
    [name] => Peter 
    [title] => Andet billede 
) 
Array 
(
    [id] => 4 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 2 
    [name] => Lucas 
    [title] => Andet billede test 
) 
Array 
(
    [id] => 1 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 3 
    [name] => Daniel 
    [title] => aar 
) 
Array 
(
    [id] => 3 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 3 
    [name] => Peter 
    [title] => Andet billede 
) 
Array 
(
    [id] => 4 
    [contest] => 2 
    [image] => dummy-item.jpg 
    [place] => 3 
    [name] => Lucas 
    [title] => Andet billede test 
) 

競賽表的示例數據:

SET NAMES utf8; 
SET FOREIGN_KEY_CHECKS = 0; 

-- ---------------------------- 
-- Table structure for `photocontest_contests` 
-- ---------------------------- 
DROP TABLE IF EXISTS `photocontest_contests`; 
CREATE TABLE `photocontest_contests` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    `description_image` varchar(255) DEFAULT NULL, 
    `prize_image` varchar(255) DEFAULT NULL, 
    `intro` text, 
    `prizes` text, 
    `rules` text, 
    `privacy_policy` text, 
    `time_start` datetime DEFAULT NULL, 
    `time_end` datetime DEFAULT NULL, 
    `published` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

-- ---------------------------- 
-- Records of `photocontest_contests` 
-- ---------------------------- 
BEGIN; 
INSERT INTO `photocontest_contests` VALUES ('1', 'Contest 1', 'dummy-cat.jpg', 'dummy-prize.jpg', 'EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.', '<div class=\"row\">\n    <div class=\"prize odd\">\n     <div class=\"prize-desc\"><h3>1. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>\n   <div class=\"row\">\n    <div class=\"prize even\">\n     <div class=\"prize-desc\"><h3>2. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>\n   <div class=\"row\">\n    <div class=\"prize odd\">\n     <div class=\"prize-desc\"><h3>3. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>', 'rules', 'privacy', '2015-05-12 14:18:02', '2015-05-28 14:18:07', '1'), ('2', 'Contest 2', 'dummy-cat.jpg', 'dummy-prize.jpg', '2 EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.', '<div class=\"row\">\n    <div class=\"prize odd\">\n     <div class=\"prize-desc\"><h3>1. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>\n   <div class=\"row\">\n    <div class=\"prize even\">\n     <div class=\"prize-desc\"><h3>2. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>\n   <div class=\"row\">\n    <div class=\"prize odd\">\n     <div class=\"prize-desc\"><h3>3. Præmie</h3><p>EOS 5D Mark III er et fullframe digitalt spejlreflekskamera med 22,3 Megapixel, autofokus med 61 punkter samt 6 bps kontinuerlig optagelse. Optag Full HD-film i høj kvalitet, og hav fuld manuel kontrol over alt lige fra billedhastighed til lyd.</p></div>\n     <div class=\"prize-image\">\n      <img src=\"images/dummy-prize.jpg\" alt=\"\" />\n     </div>\n     <div class=\"clr\"></div>\n    </div>\n   </div>', 'rules', 'privacy', '2015-05-12 14:18:02', '2015-05-12 14:18:07', '1'); 
COMMIT; 

SET FOREIGN_KEY_CHECKS = 1; 

條目表機智與樣本數據H樣本數據

SET NAMES utf8; 
SET FOREIGN_KEY_CHECKS = 0; 

-- ---------------------------- 
-- Table structure for `photocontest_entries` 
-- ---------------------------- 
DROP TABLE IF EXISTS `photocontest_entries`; 
CREATE TABLE `photocontest_entries` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `contest` int(11) DEFAULT NULL, 
    `name` varchar(255) DEFAULT NULL, 
    `email` varchar(255) DEFAULT NULL, 
    `phone` varchar(255) DEFAULT NULL, 
    `title` varchar(255) DEFAULT NULL, 
    `description` text, 
    `image` varchar(255) DEFAULT NULL, 
    `published` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 

-- ---------------------------- 
-- Records of `photocontest_entries` 
-- ---------------------------- 
BEGIN; 
INSERT INTO `photocontest_entries` VALUES ('1', '2', 'Daniel', '[email protected]', '12345678', 'aar', '', 'dummy-item.jpg', '1'), ('2', '1', 'Hans', '[email protected]', '12345678', 'Mit Billede', 'Dette er en fed beskrivelse', 'dummy-item.jpg', '1'), ('3', '2', 'Peter', '[email protected]', '12345678', 'Andet billede', 'Dette er en fed beskrivelse', 'dummy-item.jpg', '1'), ('4', '2', 'Lucas', '[email protected]', '12345678', 'Andet billede test', 'beskrivelse', 'dummy-item.jpg', '1'), ('5', '1', 'Ditte', '[email protected]', '12345678', 'Billede titel', 'Anden beskrivelse', 'dummy-item.jpg', '1'); 
COMMIT; 

SET FOREIGN_KEY_CHECKS = 1; 

優勝者表:

SET NAMES utf8; 
SET FOREIGN_KEY_CHECKS = 0; 

-- ---------------------------- 
-- Table structure for `photocontest_winners` 
-- ---------------------------- 
DROP TABLE IF EXISTS `photocontest_winners`; 
CREATE TABLE `photocontest_winners` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `contest` int(11) NOT NULL, 
    `image` int(11) DEFAULT NULL, 
    `place` int(11) DEFAULT NULL, 
    `published` tinyint(4) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; 

-- ---------------------------- 
-- Records of `photocontest_winners` 
-- ---------------------------- 
BEGIN; 
INSERT INTO `photocontest_winners` VALUES ('1', '2', '1', '1', '1'), ('4', '2', '3', '2', '1'), ('5', '2', '4', '3', '1'); 
COMMIT; 

SET FOREIGN_KEY_CHECKS = 1; 
+1

看起來像它的一對多關係,並且對於每個'photocontest_winners','photocontest_entries'中有許多條目,並且左連接返回所有匹配記錄。更好的辦法是提供一些樣本數據和樣本數據的預期結果。 –

+0

這不是關於您詢問的問題...我建議重命名查詢中的字段。當你必須使用相同名稱的字段時,你只能得到一個值。因此,您可以執行如下操作:select中的'photocontest_winners.id作爲winner_id'將其重命名,而不會使用id的第二個實例覆蓋它。 – kainaw

+1

您可能還需要加入'image'字段,但我們確實需要查看一些示例數據以及表格的結構以提供更好的答案。 – Vex

回答

0

我認爲這將是更全面的,如果你也能告訴我們列的每個表和1-2項行名爲他們。在此之後,我可以瞭解可能出現的問題。

我的第一個猜測是,你正在使用左鍵連接

JOIN photocontest_entries ON photocontest_winners.contest = photocontest_entries.contest

它不是唯一的。在表中的一個密鑰,photocontest_winners.contest有幾場比賽,photocontest_entries.contest 強大的文本其他表中的記錄。或者另一種方式......

+0

我已更新了我的問題,使用3個表中的sql轉儲及其中的示例數據:-) – Dyvel

0

正如你所寫的,你的查詢將產生每個贏家和任何匹配的特定競爭者的比賽條目。它也將返回該比賽ID的獲勝者而無需參賽。

至於別人說,因爲你不使用列別名...如果返回的記錄被捆綁到一個條目,你看到的值數組中的ID。

嘗試書面方式查詢這樣

$sql = "SELECT 
      photocontest_winners.id, 
      photocontest_winners.contest, 
      photocontest_winners.image, 
      photocontest_winners.place, 

      photocontest_entries.id as `entry_id`, 
      photocontest_entries.contest, 
      photocontest_entries.name, 
      photocontest_entries.title, 
      photocontest_entries.image 

     FROM photocontest_winners 

     LEFT JOIN photocontest_entries ON photocontest_winners.contest = photocontest_entries.contest 

     WHERE photocontest_winners.contest = $id AND photocontest_winners.published = 1 
     ORDER BY photocontest_winners.place"; 
+0

使用entry_id上的列別名沒有區別:-( – Dyvel

0

@Vex提供了答案 - 我不得不圖片ID添加到加入。

LEFT JOIN photocontest_entries ON photocontest_winners.contest = photocontest_entries.contest AND photocontest_winners.image = photocontest_entries.id

解決:-)

現在,我是一個快樂的人......感謝所有爲我的問題你的幫助 - 真的很感激!