【问题标题】:SubSelect or SubQuery子选择或子查询
【发布时间】:2013-11-22 19:42:03
【问题描述】:

下面将成功找到客户提交的产品 * http://inks-etc.com/Canon/canon_inkdesign.php?ID=114 ID=114 来自 $_GET['ID'] 并进入 SELECT 以接收产品:价格、产品编号、描述、图像。现在我一直在尝试获取大约 4 (LIMIT 4) 个更多类似的产品来捕获页面左侧,所以如果客户选择 LC41 Black,我也可以提供 LC41 Cyan、LC41 Magenta、LC41 Yellow。我认为“选择子查询”会有所帮助。你能告诉我我必须修改什么,甚至重新开始执行这项任务吗?

    $inksetc = htmlentities($_GET['ID']);

     $sql2 = "SELECT Id,   Product_Type,  Product_No ,  miniImageFarm

         FROM `Canon_INK`

         WHERE IN
             (SELECT Id= $inksetc FROM Canon_INK WHERE Id LIKE $inksetc) 

         LIMIT 4";

$result = mysqli_query($dbc,$sql2) or die(mysqli_error($dbc));

    while($rows = mysqli_fetch_array($result)){
?>

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 可能是mysql,因为他在php中使用mysqli()函数。
  • 我正在使用 PhpMyAdmin
  • PhpMyAdmin 不是一个 DBMS,它是一个名为 MySQL 的 DBMS 的前端/管理工具

标签: php mysql sql subquery


【解决方案1】:

您不需要子查询,您需要通配符 '%' 以便您可以按模式搜索,因此您的 $sql2 应该如下所示:

$sql2 = "SELECT Id,   Product_Type,  Product_No ,  miniImageFarm ";
$sql2 .= "FROM `Canon_INK` ";
$sql2 .= "WHERE Id LIKE '%".SUBSTR($inksetc,0,4)."%'";

我添加了 % 用于匹配搜索。

【讨论】:

  • 这是无效的 SQL 语法。
  • 感谢 Edper 的 LIKE / 子字符串。 FireFox 很难接受:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '%'.SUBSTR(5,0,4).'%)ORDER BY RAND() LIMIT 4' 附近使用正确的语法 如果您想查看单击此处:inks-etc.com/HP/hp_inkdesign.php?ID=5 感谢 Edper 的所有帮助:)
【解决方案2】:

我假设“LC41 Black”类型值存储在 Product_No 列中 - 而不是 Id 列。我还假设您不希望原始产品出现在类似产品列表中。

因此,您可以将表与自身连接以获得结果,而不是使用子查询:

SELECT  c.Id,  c.Product_Type,  c.Product_No,  c.miniImageFarm
FROM Canon_INK AS c
INNER JOIN 
    Canon_INK AS OriginalProduct
ON 
    SUBSTR(c.Product_No, 0, 4) = SUBSTR(OriginalProduct.Product_No, 0, 4)
AND
    c.Id != OriginalProduct.Id
WHERE
    OriginalProduct.Id = $intsect
LIMIT 4;

您的查询目前不安全 - 请不要使用 htmlentities 函数对 SQL 进行转义,而是查看mysqli_real_escape_string

【讨论】:

  • 谢谢大卫,我有这个 URL 可以和你分享:inks-etc.com/Canon/canon_inkdesign.php?ID=185 因为它给我提供了一个我不明白的错误:'字段列表'中的未知列 'c.Id' 任何建议。哦!我可以确认您对所有最新发布的公告都是正确的。很好! Jason Kraft inks-etc.com我将 $intsect 更改为 $inksetc(我的公司名称) 你说得好像我的公司是昆虫 LOL!
  • 没问题。查看您的错误 - 我认为您可能错误地复制了 SQL?确保在“FROM Canon_INK”之后包含“AS c”位。像这样$sql2 = "SELECT c.Id, c.Product_Type, c.Product_No, c.miniImageFarm FROM Canon_INK AS c INNER JOIN Canon_INK AS OriginalProduct ON SUBSTR(c.Product_No, 0, 4) = SUBSTR(OriginalProduct.Product_No, 0, 4) AND c.Id != OriginalProduct.Id WHERE OriginalProduct.Id = $inksetc LIMIT 4;";
  • 您是否尝试过我在评论中包含的更新后的 SQL?
【解决方案3】:
$inksetc = htmlentities($_GET['ID']);// need to store LC41 in $_GET['ID'].

  $sql2 = "SELECT Id,   Product_Type,  Product_No ,  miniImageFarm

     FROM `Canon_INK`

     WHERE Id IN
         (SELECT Id FROM Canon_INK WHERE Id LIKE '%".$inksetc."%') // use Id instead of Id= $inksetc.

     LIMIT 4";

$result = mysqli_query($dbc,$sql2) or die(mysqli_error($dbc));

 while($rows = mysqli_fetch_array($result)){

?>

【讨论】:

    【解决方案4】:

    我相信你想要这样的东西:

    SELECT Id, Product_Type, Product_No, miniImageFar
    FROM Canon_INK
    WHERE SUBSTR(Id, 0, 4) = SUBSTR($inksetc, 0, 4)
    

    阅读LIKE 运算符;它并不是说一个字符串和另一个字符串相似,而是说一个字符串匹配一个模式。

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      相关资源
      最近更新 更多