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