带有IN或INNER JOIN的子查询

时间:2014-01-20 03:29:45

标签: mysql sql subquery

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 |
+----------+------------+                +-----+------------+----------+

客户将登录他们: 用户名:jason和密码:123

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

我想收到客户收到的4种“LIKE”产品。例如: 如果客户已收到HP74BK; HEW作为“添加到CART”的产品;我想要 将HP 74 Cyan,HP 74 Magenta和HP 74Yellow作为cusotmers添加 选择购买。

我在登录用户名时收到了客户UserId“2”。然后我用 在子查询中使用TABLE获取product_no:SignUp和IN
带有TABLE的Product_No:Thinker2014,它允许我需要的其他产品。 我已经尝试过INNER JOINING,但我很难完成 $ user_id

这是我需要帮助的续集: 查询具有产品图片所需的产品选择。 这两个表格:SignUp包含他们想要购买的客户产品和 Thinker2014存储他们想要购买的产品;而我正试图进入或进入 加入他们不仅可以获得他们需要的产品,还可以获得额外的“LIKE”产品 他们可能需要的一面,如墨盒的不同颜色(青色,mag,黄色)。

<?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
?>

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您想要推荐其他颜色不同的产品(与某个user_id的product_no的前4个字符相匹配)。

所以以下查询的作用是从Thinker2014中选择与该user_id的product_no不同但是喜欢(前4个字符并以通配符%结尾)的产品。该user_id的product_no

SELECT Product_No,miniImageFarm
FROM Thinker2014
WHERE Product_No != (SELECT Product_No FROM SignUp WHERE User_Id = $user_id)
  AND Product_No LIKE (SELECT CONCAT(LEFT(Product_No,4),'%') FROM SignUp WHERE User_Id = $user_id)
LIMIT 4

请参阅此sqlFiddle

只要user_id表中的每个signup只有一个条目,这将有效。如果user_idsignup表中有多个条目,则您必须根据signup表中的auto_incremented列通过某种排序来决定您想要的条目,如下所示(注意ORDER BY someIdColumn DESC LIMIT 1

SELECT Product_No,miniImageFarm
FROM Thinker2014
WHERE Product_No != (SELECT Product_No FROM SignUp WHERE User_Id = $user_id ORDER BY someIdColumn DESC LIMIT 1)
  AND Product_No LIKE (SELECT CONCAT(LEFT(Product_No,4),'%') FROM SignUp WHERE User_Id = $user_id ORDER BY someIdColumn DESC LIMIT 1)
LIMIT 4

如果您想使用INNER JOIN作为解决方案,您可以使用LEFT(Product_No,4)如下所示基于Product_No的前4个字符加入(如果有2个或更多条目,则此版本不会中断注册表中的某个user_id)

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

请参阅此sqlFiddle

如果您在Thinker2014表中碰巧有多个行具有相同的product_no(和相同的颜色),并且您希望为同一产品HP74返回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;

sqlFiddle
以上查询的作用是ORDER BY T.Product_No,以便它扫描每个Product_No,以便所有相同的颜色都是正确的(例如,扫描3行青色,然后扫描8行洋红色,然后5行黄色产品HP74)
每当@row变量看到一个新的Product_No值时(意味着当我们的@prevProductNo IS为NULL时尚未设置为任何东西或者它看到一个新的Product_No)并且向上计数时,它将被设置为1 Cyan为2,3,Magenta为1,2,3,4,5,6,7,8,然后是黄色1,2,3,4,5,我们将每行称为{{1 }}。
row意味着我们只需要行值为1的行,因此它将获取青色的第1行和洋红色的第1行以及第1行的黄色。如果有更多颜色,它将抓住每种颜色的第1行。那么查询将获取不同的颜色。并且LIMIT 4将返回最多4个条目(不同颜色)。

以下查询将匹配前4个字符,并以相同的字符结尾,例如HAVING row = 1;HEW,具体取决于注册表中的Product_No。

;CPT

sqlFiddle