Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有IN或内部联接的子查询_Mysql_Sql_Subquery - Fatal编程技术网

Mysql 具有IN或内部联接的子查询

Mysql 具有IN或内部联接的子查询,mysql,sql,subquery,Mysql,Sql,Subquery,客户将登录其: 用户名:jason,密码:123 转到:inks-etc.com->登录->提交上述信息->单击下一页 我想收到客户收到的4个“类似”产品。例如: 如果客户已收到HP74BK;将HEW作为产品“添加到购物车”;我想要 要将HP 74青色、HP 74品红和HP 74黄色作为附加颜色放置 选择购买 我在客户登录用户名时收到了客户用户名“2”。然后我用 在子查询中获取表所需的产品号:SignUp和in 表中的产品编号:Thinker2014,允许我使用其他需要的产品。 我已经尝试过内部

客户将登录其: 用户名:jason,密码:123

转到:inks-etc.com->登录->提交上述信息->单击下一页

我想收到客户收到的4个“类似”产品。例如: 如果客户已收到HP74BK;将HEW作为产品“添加到购物车”;我想要 要将HP 74青色、HP 74品红和HP 74黄色作为附加颜色放置 选择购买

我在客户登录用户名时收到了客户用户名“2”。然后我用 在子查询中获取表所需的产品号:SignUp和in
表中的产品编号:Thinker2014,允许我使用其他需要的产品。 我已经尝试过内部连接,但是我在子查询方面遇到了困难 $user\u id

以下是我需要帮助的续集: 查询具有所需的产品选择和产品图片。 这两张表:注册包含客户想要购买的产品和 Thinker2014存储他们想要购买的产品;我试着在内心深处 加入他们,不仅可以获得他们需要的一种产品,还可以获得额外的“同类”产品 他们可能需要的一面像墨盒的不同颜色(青色、墨绿色、黄色)

Table:  SignUp                               Table:  Thinker2014

+----------+------------+                +-----+------------+----------+
| User_Id  | Product_No |                | Id  | Product_No |  Pic_One |
+----------+------------+                +-----+------------+----------+
|    2     | HP74BK;HEW |                |  1  | HP74BK;HEW | hew1.jpg |
+----------+------------+                +-----+------------+----------+
|    9     | LC41C;HEW  |                |  2  | HP74BC;HEW | hew1.jpg |
+----------+------------+                +-----+------------+----------+
|   13     | BC21M;HEW  |                |  3  | HP74M;HEW  | hew1.jpg |
+----------+------------+                +-----+------------+----------+
|   24     | HP74Y;HEW  |                |  4  | HP74Y;HEW  | hew1.jpg |
+----------+------------+                +-----+------------+----------+

“alt=”“name=“迷你图像”
border=“0”/>

如果我理解正确,那么您希望推荐其他不同颜色的产品(与特定用户id的产品编号的前4个字符相匹配)

因此,下面的查询所做的是从
Thinker2014
中选择产品,这些产品不同于该用户id的
product\u no
,但类似于该用户id的
product\u no
(前4个字符,以通配符
%
结尾)

<?php
include "../../SearchEngine/dbc_site.php";
$user_id = $_SESSION['uid'];

$query = "SELECT `Thinker2014`.`Product_No`,`Thinker2014`.`miniImageFarm`
          FROM `Thinker2014`
          WHERE `Product_No` LIKE `SignUp`.`Product_No`
          IN
             (SELECT `Product_No`
              FROM `SignUp`
              WHERE $user_id)
          LIMIT 4";

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

while($row = mysqli_fetch_array($result)) {
    $miniImage = $row['miniImageFarm'];
    $Product_No = $row['Product_No'];
?>
  <tr>
    <td>
       <table>
          <tr>
             <td><img src="<?php echo $miniImage ?>" alt="" name="miniImage"
             border="0"/></td>
                <td><?php echo $Product_No ?></td>
           </tr>
        </table>
    </td>
</tr>
<?php
}  // End of SECOND while loop
?>
看到这个了吗

只要在
signup
表中每个
user\u id
只有一个条目,这就行了。如果
user\u id
signup
表中有多个条目,您就必须根据
signup
表中的自动递增列,通过某种排序来决定您想要哪个条目,如下所示(注意,
按someIdColumn DESC LIMIT 1排序)

如果您想使用内部连接作为解决方案,您可以使用
LEFT(Product\u No,4)
如下方式,基于Product\u No的前4个字符进行连接(如果注册表中某个用户id有2个或更多条目,此版本不会中断)

看到这个了吗

如果您在Thinker2014表中碰巧有多行具有相同的产品编号(和相同的颜色),并且您希望为相同的产品返回4种不同的颜色,例如,您可以使用下面的查询

SELECT T.Product_No,T.miniImageFarm
FROM Thinker2014 T
INNER JOIN SignUp S ON LEFT(T.Product_No,4) = LEFT(S.Product_No,4)
WHERE T.Product_No != S.Product_No
  AND S.User_Id = $user_id
LIMIT 4

上面的查询所做的是
按T.Product\u No进行排序
,这样它就可以扫描每个产品,使所有相同的颜色紧跟其后(例如,扫描3行青色,然后扫描8行品红,然后扫描5行黄色,对于产品HP74)
@row
变量在看到新产品时会被设置为1(这意味着当我们的
@prevProductNo
尚未设置为任何值时,或者如果它看到新产品时,它会被设置为空值)例如,青色向上计数2,3,品红色向上计数1,2,3,4,5,6,7,8,黄色向上计数1,2,3,4,5,我们将每行的该值称为

HAVING row=1
意味着我们只需要行值为1的行,因此它将获取青色的第1行、品红的第1行和黄色的第1行。如果有更多颜色,它将获取每种颜色的第1行。因此,查询将获取不同的颜色。限制4将最多返回4个条目(不同颜色的)

下面的查询将匹配前4个字符,并以相同的字符结尾,例如
;HEW
;CPT
,具体取决于注册表中的产品编号

SELECT T.Product_No,T.miniImageFarm,
       @row := IF (@prevProductNo IS NULL OR @prevProductNo != T.Product_No,1,@row+1) as row,
       @prevProductNo := T.Product_No
FROM Thinker2014 T
INNER JOIN SignUp S ON LEFT(T.Product_No,4) = LEFT(S.Product_No,4)
WHERE T.Product_No != S.Product_No
  AND S.User_Id = $user_id
HAVING row = 1
ORDER BY T.Product_No
LIMIT 4;

谢谢Tin Tran…第一个有效,提供了4个相同的产品编号…第二个无效“SomeId”列的b/c",我不明白。总而言之,脚本被接受的事实让我感觉像是攀登了一座山。内部连接符合条件吗?你将$user\u id=2变成了使用子查询而不是表的内部连接注册的产品。\u编号:Thinker2014是非凡的。我如何学习更多SQL或什么书您可能会推荐这款傻瓜或奥利。欢迎您发电子邮件给我:info@inks-只要子查询中的SELECT只返回一行,etc.comit就可以工作,如果子查询返回2行或更多行,它就会中断,这就是为什么我提到了第二个查询,如果您有auto_increment id列。这样它可以保证1行并始终有效。如果您想了解更多SQL,只需在此处搜索MySQL标记,它们就可以解决人们遇到的特定问题,您可以从阅读问题和答案中学到很多。请看我答案的底部,它有一个内部连接解决方案,如果您需要的话首选。等等,你说“提供了4个相同的产品”?这是个问题吗?你是否在
Thinker2014
中有重复的值,并且你希望所有4个都以HP74开头,但彼此有不同的结尾(代表所有不同的颜色)?
SELECT T.Product_No,T.miniImageFarm
FROM Thinker2014 T
INNER JOIN SignUp S ON LEFT(T.Product_No,4) = LEFT(S.Product_No,4)
WHERE T.Product_No != S.Product_No
  AND S.User_Id = $user_id
LIMIT 4
SELECT T.Product_No,T.miniImageFarm,
       @row := IF (@prevProductNo IS NULL OR @prevProductNo != T.Product_No,1,@row+1) as row,
       @prevProductNo := T.Product_No
FROM Thinker2014 T
INNER JOIN SignUp S ON LEFT(T.Product_No,4) = LEFT(S.Product_No,4)
WHERE T.Product_No != S.Product_No
  AND S.User_Id = $user_id
HAVING row = 1
ORDER BY T.Product_No
LIMIT 4;
SELECT T.Product_No,T.miniImageFarm,
 @row := IF (@prevProductNo IS NULL OR @prevProductNo != T.Product_No,1,@row+1) as row,
 @prevProductNo := T.Product_No
FROM Thinker2014 T
INNER JOIN SignUp S ON T.Product_No LIKE CONCAT(LEFT(S.Product_No,4),'%;',SUBSTRING_INDEX(S.Product_No,';',-1))
WHERE T.Product_No != S.Product_No
 AND S.User_Id = $user_id
HAVING row = 1
ORDER BY T.Product_No
LIMIT 4;