选择DISTINCT并且JOIN不起作用

时间:2015-11-18 15:11:22

标签: php mysqli

我已经为此工作了好几天......我只是在学习,而且我正在阅读所有的教程,但这对我不起作用!我知道问题有很多答案,但我必须输入错误的内容......

1KaraokeDJ = 1KaraokeDJcopy,因为我无法弄清楚使用AS来创建一个临时用于JOIN的临时使用DISTINCT 1 SELECT

ID是主要唯一密钥 输出中需要艺术家,标题,光盘,曲目,品牌

使用DISTINCT标题时,品牌结果只有那两列 所以我想我必须加入ID以便我可以拥有Distinct记录并且仍然拥有所有列......可能有更好的方法来做到这一点但是我可以找到阅读各种教程的所有内容。

<?php ...
$searchterm="call me";
$searchresults=$db->query("select DISTINCT Title, Brand from 1KaraokeDJcopy JOIN 1KaraokeDJ ON 1KaraokeDJcopy.ID=1KaraokeDJ.ID where Title like '%$searchterm%' limit 100");

        if(mysqli_num_rows($searchresults) > 0) {
          while($descri=mysqli_fetch_object($searchresults)) { ?>
            <div class="reslt">
              <h3 id="results">
                <?php
                  echo $descri->Artist); echo " - ";
                  echo $descri->Title);
                ?>
              </h3>
              <p class="Description">
                <?php
                  echo $descri->Brand; echo " - ";
                  echo $descri->Disc); echo " - ";
                  echo $descri->Track;
                ?>
              </p>
              <hr>
            </div>
          <?php } ?>

我没有查询上面的代码(print_r($ searchresults);是null)

$searchresults=$db->query("select * from 1KaraokeDJ where Title like '%$searchterm%' order by Artist, Disc limit 100");

产生21个结果,重复4个(重复品牌,因为多个光盘上的同一首歌,即使不同的光盘编号,即CB5016-01和CBEP467-1,但两个品牌都是Chartbuster)

$searchresults=$db->query("select DISTINCT Title, Brand from 1KaraokeDJ where Title like '%$searchterm%' limit 100");

生成正确的17个结果,但我的输出不再包含艺术家,光盘,曲目

1KaraokeDJ的表结构

CREATE TABLE IF NOT EXISTS `1KaraokeDJ` (
  `Disc` varchar(12) COLLATE latin1_general_ci NOT NULL,
  `Track` enum('01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36') COLLATE latin1_general_ci NOT NULL,
  `Artist` varchar(50) COLLATE latin1_general_ci NOT NULL,
  `Title` varchar(50) COLLATE latin1_general_ci NOT NULL,
  `Brand` enum('Chartbuster','DKKaraoke','Karaoke Hits','Sound Choice','Sunfly') COLLATE latin1_general_ci NOT NULL,
  `ID` smallint(5) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`),
  KEY `Disc` (`Disc`),
  KEY `Artist` (`Artist`),
  KEY `Title` (`Title`),
  KEY `Brand` (`Brand`),
  FULLTEXT KEY `Artist_2` (`Artist`),
  FULLTEXT KEY `Title_2` (`Title`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=28618 ;

3 个答案:

答案 0 :(得分:1)

步骤0:通过将此行添加到PHP文件来启用error_reporting

error_reporting(E_ALL); ini_set('display_errors', 'On');

步骤0.1:如果MySQL没有按预期工作,请直接在MySQL中进行查询。

  1. 我不明白为什么你需要加入。您正在使用ID = ID将表连接到自身,这无法完成任何操作。
  2. 1.1(你不需要这样做但是为了完整性)     要将表连接到自身,语法将是

    SELECT * FROM table1 JOIN table1 as table1copy ON table1.col1 = table1copy.col2
    
    1. 输出中需要的每列都需要在SELECT子句中。

      SELECT Artist, Title, Brand, Disc, Track FROM ...

    2. 如果甚至有一列不同,你实际上并没有得到重复。这不是重复的。我不完全理解你想要的结果,但我认为GROUP BY可能会有所帮助。

答案 1 :(得分:0)

如果你写了

,你忘了在查询上写列名
select DISTINCT Title, Brand from 1KaraokeDJ where Title like '%$searchterm%' limit 100

查询将仅选择DISTINCT TitleBrand。只有*选择所有列,否则您必须指定所有列,因此您应该像这样编写查询:

select DISTINCT Title, Brand,Artist,Disc,Track from 1KaraokeDJ where Title like '%$searchterm%' limit 100

附注:您是否正在使用$searchtermmysqli_函数转义PDO值?如果没有,您应该避免SQL Injections:)

答案 2 :(得分:0)

好的,首先在您的查询中,您没有提供从哪个表中获取列以及哪个表列必须与值匹配。查询应如下所示:

$searchresults=$db->query("select DISTINCT 1KaraokeDJcopy.Title, 1KaraokeDJcopy.Brand from 1KaraokeDJcopy JOIN 1KaraokeDJ ON 1KaraokeDJcopy.ID=1KaraokeDJ.ID where 1KaraokeDJcopy.Title like '%$searchterm%' limit 100");

其次,如果没有提供您的架构和所有数据库结构,很难说,但我会使用此查询(没有任何连接,不同的值,但有分组):

$searchresults=$db->query("select * from 1KaraokeDJ where Title like '%$searchterm%' group by Title, Brand limit 100");