上記を想起
祭り我々は模造実現jd
機能カルーセル広告および製品分類をし、我々は製品情報を表示するには、当社の主要なビジネスの電力供給を実現していきます、このセクションでは、さまざまな注入方法を説明しました。
要求分析
私たちは、このセクションをコーディングを開始する前にまず、我々は最初のディスプレイ上の商品、開きますどのような分野を分析する必要がありjd
、次のようにホームページを、マウスプルダウンを見ることができます。
これは、最初のページにある大型タイプで、ディスプレイ上の商品の一部を照会見ることができ、その後、以下を参照してください、任意の分類をクリックしてください(推奨サイトなどすることができ、最新の状態にすることができます):
我々は、一般的に電気事業のウェブサイトに、最も一般的な機能を検索したら、検索ピアノの結果は以下の通りであります:
商品のいずれかをクリックして選択し、あなたは詳細ページを入力することができ、これは、単一の商品情報表示です。
要約すると、我々は商品陳列、電子ビジネスプラットフォームを達成するためにことを知っている、最も基本的には、次のとおりです。
- ホームページ特集/新着商品
- クエリ商品分類
- キーワード検索商品
- 商品の詳細を表示
- ...
次に、我々はコモディティ関連事業の開発を開始することができます。
ホーム商品リスト| IndexProductList
開発梳綿
私たちは、どのような情報を見に表示するために、どのように表示するために必要とされ、自宅ショーで推奨される製品のリストを実装するために開始します。
- 商品の主キー(PRODUCT_ID)
- ディスプレイの写真(IMAGE_URL)
- 製品名(PRODUCT_NAME)
- 商品価格(PRODUCT_PRICE)
- カテゴリ説明(説明)
- カテゴリ名(カテゴリ名)
- 分類主キー(CATEGORY_ID)
- その他...
コーディング
分類されたお問い合わせによると、
私たちは同じテーブルにする必要があるため、根本的なマッパーが解決できない場合は、下から上へ、秩序の発展をフォローし、優先順位の書き込みSQLマッパーparent_id
データ再帰クエリのために、当然のことながら、我々はここで使用され表链接
達成する方法。そのため、common mapper
カスタムマッパーを達成するための必要性を我々のニーズを満たすことができません。
カスタムマッパーを達成します
そして、セクションのプロジェクトのような機密情報のサブカテゴリに応じて、mscx-shop-mapper
インターフェイスのカスタム実装を追加しcom.liferunner.custom.ProductCustomMapper
、その後、resources\mapper\custom
xmlファイルのパスを作成するための同期mapper/custom/ProductCustomMapper.xml
たちがセクションに現在のフォルダに設定されているされているので、この時間は、コンテナをスキャンすることができます我々は新しいマッパースキャンがスタートアップコードにロードされます追加して、次のとおりです。
/**
* ProductCustomMapper for : 自定义商品Mapper
*/
public interface ProductCustomMapper {
/***
* 根据一级分类查询商品
*
* @param paramMap 传递一级分类(map传递多参数)
* @return java.util.List<com.liferunner.dto.IndexProductDTO>
*/
List<IndexProductDTO> getIndexProductDtoList(@Param("paramMap") Map<String, Integer> paramMap);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liferunner.custom.ProductCustomMapper">
<resultMap id="IndexProductDTO" type="com.liferunner.dto.IndexProductDTO">
<id column="rootCategoryId" property="rootCategoryId"/>
<result column="rootCategoryName" property="rootCategoryName"/>
<result column="slogan" property="slogan"/>
<result column="categoryImage" property="categoryImage"/>
<result column="bgColor" property="bgColor"/>
<collection property="productItemList" ofType="com.liferunner.dto.IndexProductItemDTO">
<id column="productId" property="productId"/>
<result column="productName" property="productName"/>
<result column="productMainImageUrl" property="productMainImageUrl"/>
<result column="productCreateTime" property="productCreateTime"/>
</collection>
</resultMap>
<select id="getIndexProductDtoList" resultMap="IndexProductDTO" parameterType="Map">
SELECT
c.id as rootCategoryId,
c.name as rootCategoryName,
c.slogan as slogan,
c.category_image as categoryImage,
c.bg_color as bgColor,
p.id as productId,
p.product_name as productName,
pi.url as productMainImageUrl,
p.created_time as productCreateTime
FROM category c
LEFT JOIN products p
ON c.id = p.root_category_id
LEFT JOIN products_img pi
ON p.id = pi.product_id
WHERE c.type = 1
AND p.root_category_id = #{paramMap.rootCategoryId}
AND pi.is_main = 1
LIMIT 0,10;
</select>
</mapper>
サービスの実装
でservice
作成プロジェクトcom.liferunner.service.IProductService接口
とその実装クラスcom.liferunner.service.impl.ProductServiceImpl
以下のように、クエリを追加します。
public interface IProductService {
/**
* 根据一级分类id获取首页推荐的商品list
*
* @param rootCategoryId 一级分类id
* @return 商品list
*/
List<IndexProductDTO> getIndexProductDtoList(Integer rootCategoryId);
...
}
---
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ProductServiceImpl implements IProductService {
// RequiredArgsConstructor 构造器注入
private final ProductCustomMapper productCustomMapper;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<IndexProductDTO> getIndexProductDtoList(Integer rootCategoryId) {
log.info("====== ProductServiceImpl#getIndexProductDtoList(rootCategoryId) : {}=======", rootCategoryId);
Map<String, Integer> map = new HashMap<>();
map.put("rootCategoryId", rootCategoryId);
val indexProductDtoList = this.productCustomMapper.getIndexProductDtoList(map);
if (CollectionUtils.isEmpty(indexProductDtoList)) {
log.warn("ProductServiceImpl#getIndexProductDtoList未查询到任何商品信息");
}
log.info("查询结果:{}", indexProductDtoList);
return indexProductDtoList;
}
}
コントローラの実装
その後、内com.liferunner.api.controller.IndexController
外部被ばく問合せインタフェースの実現:
@RestController
@RequestMapping("/index")
@Api(value = "首页信息controller", tags = "首页信息接口API")
@Slf4j
public class IndexController {
...
@Autowired
private IProductService productService;
@GetMapping("/rootCategorys")
@ApiOperation(value = "查询一级分类", notes = "查询一级分类")
public JsonResponse findAllRootCategorys() {
log.info("============查询一级分类==============");
val categoryResponseDTOS = this.categoryService.getAllRootCategorys();
if (CollectionUtils.isEmpty(categoryResponseDTOS)) {
log.info("============未查询到任何分类==============");
return JsonResponse.ok(Collections.EMPTY_LIST);
}
log.info("============一级分类查询result:{}==============", categoryResponseDTOS);
return JsonResponse.ok(categoryResponseDTOS);
}
...
}
テストAPI
終了後、我々は我々のコードの検証をテストする必要がある、または使用することによりRestService
、以下のようにプラグインを実装するために、もちろん、我々はまた、ポストマンによってテストすることができ、結果は以下のとおりです。
商品リスト| ProductList
我々は、テキストのオープンJingdongは製品リストの先頭を参照してくださいように、我々は最初のリストのページが必要な製品の情報のどの要素を分析しますか?
開発梳綿
2つのカテゴリに分かれ、合計、私たちの以前の分析に基づいて商品の一覧を表示します。
- すべての商品の現在の分類を示す、商品分類を選択した後
- 現在の検索に関連するすべての項目を表示するには、検索キーワードを入力してください
我々はパラメータに従って分離を実装するために統一されたインタフェースを使用することができそうだとすれば、これらの二つのカテゴリーで提示商品リストのデータは、異なるデータソースに加えて、他の要素は、基本的に一致していますか?我々はいくつかの予測可能な機能要件を実現する際に理論的には問題がない、脇自分の後部開発を与える必要があり、判決を渡すパラメータを使用してデータを返すことができますが、である、私たちはしばしば言います可拓展性
、これに基づいて、我々は後半に拡大するためには、彼らの別々のインタフェースを実現します。
そして、リストページ内の要素を分析するために、我々は最初のためのすべてのをするために、我々は、我々はAPIを設計していたときに対処する必要があり、両方のケースを分割する必要が、表示する必要があり
1.製品リストの分類を披露、パラメータを渡す必要があります:
- カテゴリID
- ソート(私たちのリストのいくつかの一般的なソート(販売数量、価格など)での電気の供給者)
- (私たちはすべての商品のデータベースを取り出して置くことができないので)関連のページング
- ページ番号(現在の最初の数ページ)
- PageSize(ページあたりのデータ数)
2.キーワード検索商品リストに、パラメータを渡す必要があります:
- キーワード
- ソート(私たちのリストのいくつかの一般的なソート(販売数量、価格など)での電気の供給者)
- (私たちはすべての商品のデータベースを取り出して置くことができないので)関連のページング
- ページ番号(現在の最初の数ページ)
- PageSize(ページあたりのデータ数)
表示され、必要な情報のページには、以下のとおりです。
- プロダクトID(とのためのジャンプリスト)
- 製品名
- 商品代金
- 商品の販売
- 商品画像
- 製品のお得な情報
- ...
コーディング
上記の我々の分析によると、私たちは、次のコードを始めます。
製品タイプのクエリ
我々はマルチテーブル共同捜査に必要なので、私たちは私たちのお問い合わせのカスタムマッパー機能で実装する必要があるので、我々の分析によると、確かに、フル・テーブル内のすべてのデータを取得することはできません。
達成ResponseDTO
我々の分析の前に提示される情報のフロントエンド、我々は情報を表示するためのターゲットを定義しcom.liferunner.dto.SearchProductDTO
、以下のように、:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SearchProductDTO {
private String productId;
private String productName;
private Integer sellCounts;
private String imgUrl;
private Integer priceDiscount;
//商品优惠,我们直接计算之后返回优惠后价格
}
カスタムマッパーを達成します
ではcom.liferunner.custom.ProductCustomMapper.java
新しいインターフェイスA方式:
List<SearchProductDTO> searchProductListByCategoryId(@Param("paramMap") Map<String, Object> paramMap);
一方、中mapper/custom/ProductCustomMapper.xml
、当社のqueryメソッドの実現:
<select id="searchProductListByCategoryId" resultType="com.liferunner.dto.SearchProductDTO" parameterType="Map">
SELECT
p.id as productId,
p.product_name as productName,
p.sell_counts as sellCounts,
pi.url as imgUrl,
tp.priceDiscount
FROM products p
LEFT JOIN products_img pi
ON p.id = pi.product_id
LEFT JOIN
(
SELECT product_id, MIN(price_discount) as priceDiscount
FROM products_spec
GROUP BY product_id
) tp
ON tp.product_id = p.id
WHERE pi.is_main = 1
AND p.category_id = #{paramMap.categoryId}
ORDER BY
<choose>
<when test="paramMap.sortby != null and paramMap.sortby == 'sell'">
p.sell_counts DESC
</when>
<when test="paramMap.sortby != null and paramMap.sortby == 'price'">
tp.priceDiscount ASC
</when>
<otherwise>
p.created_time DESC
</otherwise>
</choose>
</select>
ここでは主に説明するために<choose>
、モジュールを、なぜ使用しないようにif
ラベルを。
時々 、私たちは、のすべての条件が両方とも有効であり、あなただけのいくつかのオプションから選択が、使用したいしたくないIF
限り、ラベルをtest
式があるtrue
、実行されるIF
状態タグを。MyBatisのは、提供choose
の要素を。IF
ラベルは、与(and)
関係、および選択或(or)
の関係を。
上から下へ順に、その選択、任意の条件がある場合は、オプトアウト、満足しています。
サービスの実装
そして、サービスでcom.liferunner.service.IProductService
添加法インタフェース:
/**
* 根据商品分类查询商品列表
*
* @param categoryId 分类id
* @param sortby 排序方式
* @param pageNumber 当前页码
* @param pageSize 每页展示多少条数据
* @return 通用分页结果视图
*/
CommonPagedResult searchProductList(Integer categoryId, String sortby, Integer pageNumber, Integer pageSize);
実装クラスにcom.liferunner.service.impl.ProductServiceImpl
上記の方法で:
// 方法重载
@Override
public CommonPagedResult searchProductList(Integer categoryId, String sortby, Integer pageNumber, Integer pageSize) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("categoryId", categoryId);
paramMap.put("sortby", sortby);
// mybatis-pagehelper
PageHelper.startPage(pageNumber, pageSize);
val searchProductDTOS = this.productCustomMapper.searchProductListByCategoryId(paramMap);
// 获取mybatis插件中获取到信息
PageInfo<?> pageInfo = new PageInfo<>(searchProductDTOS);
// 封装为返回到前端分页组件可识别的视图
val commonPagedResult = CommonPagedResult.builder()
.pageNumber(pageNumber)
.rows(searchProductDTOS)
.totalPage(pageInfo.getPages())
.records(pageInfo.getTotal())
.build();
return commonPagedResult;
}
ここでは、我々が使用する必要がmybatis-pagehelper
プラグインを、利点の以下の説明で分解されます。
コントローラの実装
していきcom.liferunner.api.controller.ProductController
APIによって公開された外部インタフェースを追加します。
@GetMapping("/searchByCategoryId")
@ApiOperation(value = "查询商品信息列表", notes = "根据商品分类查询商品列表")
public JsonResponse searchProductListByCategoryId(
@ApiParam(name = "categoryId", value = "商品分类id", required = true, example = "0")
@RequestParam Integer categoryId,
@ApiParam(name = "sortby", value = "排序方式", required = false)
@RequestParam String sortby,
@ApiParam(name = "pageNumber", value = "当前页码", required = false, example = "1")
@RequestParam Integer pageNumber,
@ApiParam(name = "pageSize", value = "每页展示记录数", required = false, example = "10")
@RequestParam Integer pageSize
) {
if (null == categoryId || categoryId == 0) {
return JsonResponse.errorMsg("分类id错误!");
}
if (null == pageNumber || 0 == pageNumber) {
pageNumber = DEFAULT_PAGE_NUMBER;
}
if (null == pageSize || 0 == pageSize) {
pageSize = DEFAULT_PAGE_SIZE;
}
log.info("============根据分类:{} 搜索列表==============", categoryId);
val searchResult = this.productService.searchProductList(categoryId, sortby, pageNumber, pageSize);
return JsonResponse.ok(searchResult);
}
唯一必要なカテゴリIDが必要とされることにより、私たちの要求は、発信者の残りの部分は提供できませんので、しかし、あなたがそれを提供しない場合、私たちは、通常のシステムと安定したことを確実にするために、いくつかのシステムのデフォルトのパラメータを設定する必要があります。ランは、そのため、私が定義したcom.liferunner.api.controller.BaseController
一般的な設定情報の一部を格納します。
/**
* BaseController for : controller 基类
*/
@Controller
public class BaseController {
/**
* 默认展示第1页
*/
public final Integer DEFAULT_PAGE_NUMBER = 1;
/**
* 默认每页展示10条数据
*/
public final Integer DEFAULT_PAGE_SIZE = 10;
}
テストAPI
試験パラメータは以下の通りであった:区分:51、SORTBY:価格、ページ番号:1のpageSize:5
あなたが見ることができる、我々 7つのデータへのクエリは、総ページ数はtotalPage
2である、と小さなから大に我々のコードが正しいことを証明するために、価格に応じてソート。次に、同じコード・ロジックは、我々は、検索キーワードに基づいてクエリを達成するために続けています。
キーワードクエリをよります
レスポンスDTOを達成します
上記の実装を使用しますcom.liferunner.dto.SearchProductDTO
。
カスタムマッパーを達成します
ではcom.liferunner.custom.ProductCustomMapper
新しい方法:
List<SearchProductDTO> searchProductList(@Param("paramMap") Map<String, Object> paramMap);
でmapper/custom/ProductCustomMapper.xml
追加クエリのSQL:
<select id="searchProductList" resultType="com.liferunner.dto.SearchProductDTO" parameterType="Map">
SELECT
p.id as productId,
p.product_name as productName,
p.sell_counts as sellCounts,
pi.url as imgUrl,
tp.priceDiscount
FROM products p
LEFT JOIN products_img pi
ON p.id = pi.product_id
LEFT JOIN
(
SELECT product_id, MIN(price_discount) as priceDiscount
FROM products_spec
GROUP BY product_id
) tp
ON tp.product_id = p.id
WHERE pi.is_main = 1
<if test="paramMap.keyword != null and paramMap.keyword != ''">
AND p.item_name LIKE "%${paramMap.keyword}%"
</if>
ORDER BY
<choose>
<when test="paramMap.sortby != null and paramMap.sortby == 'sell'">
p.sell_counts DESC
</when>
<when test="paramMap.sortby != null and paramMap.sortby == 'price'">
tp.priceDiscount ASC
</when>
<otherwise>
p.created_time DESC
</otherwise>
</choose>
</select>
サービスの実装
でcom.liferunner.service.IProductService
新しいクエリインターフェイス:
/**
* 查询商品列表
*
* @param keyword 查询关键词
* @param sortby 排序方式
* @param pageNumber 当前页码
* @param pageSize 每页展示多少条数据
* @return 通用分页结果视图
*/
CommonPagedResult searchProductList(String keyword, String sortby, Integer pageNumber, Integer pageSize);
でcom.liferunner.service.impl.ProductServiceImpl
インターフェイスメソッドの実装:
@Override
public CommonPagedResult searchProductList(String keyword, String sortby, Integer pageNumber, Integer pageSize) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("keyword", keyword);
paramMap.put("sortby", sortby);
// mybatis-pagehelper
PageHelper.startPage(pageNumber, pageSize);
val searchProductDTOS = this.productCustomMapper.searchProductList(paramMap);
// 获取mybatis插件中获取到信息
PageInfo<?> pageInfo = new PageInfo<>(searchProductDTOS);
// 封装为返回到前端分页组件可识别的视图
val commonPagedResult = CommonPagedResult.builder()
.pageNumber(pageNumber)
.rows(searchProductDTOS)
.totalPage(pageInfo.getPages())
.records(pageInfo.getTotal())
.build();
return commonPagedResult;
}
上記の方法に先立ちとsearchProductList(Integer categoryId, String sortby, Integer pageNumber, Integer pageSize)
の唯一の違いは、目的が事業拡大及び対価の異なる種類のオーバーロードされた私たちのフォローアップを使用することです、それはデータのクエリの特定の検索キーワードであるということです。
コントローラの実装
でcom.liferunner.api.controller.ProductController
、検索APIの追加キーワード:
@GetMapping("/search")
@ApiOperation(value = "查询商品信息列表", notes = "查询商品信息列表")
public JsonResponse searchProductList(
@ApiParam(name = "keyword", value = "搜索关键词", required = true)
@RequestParam String keyword,
@ApiParam(name = "sortby", value = "排序方式", required = false)
@RequestParam String sortby,
@ApiParam(name = "pageNumber", value = "当前页码", required = false, example = "1")
@RequestParam Integer pageNumber,
@ApiParam(name = "pageSize", value = "每页展示记录数", required = false, example = "10")
@RequestParam Integer pageSize
) {
if (StringUtils.isBlank(keyword)) {
return JsonResponse.errorMsg("搜索关键词不能为空!");
}
if (null == pageNumber || 0 == pageNumber) {
pageNumber = DEFAULT_PAGE_NUMBER;
}
if (null == pageSize || 0 == pageSize) {
pageSize = DEFAULT_PAGE_SIZE;
}
log.info("============根据关键词:{} 搜索列表==============", keyword);
val searchResult = this.productService.searchProductList(keyword, sortby, pageNumber, pageSize);
return JsonResponse.ok(searchResult);
}
テストAPI
試験パラメータ:キーワード:西フェニックス、SORTBY:販売、PAGENUMBER:1 、pageSizeを:10
通常、通常のクエリのキーワード、第32条、10ページ、通常の3の合計の合計数をソート売上に基づきます。
福祉を説明します
このセクションではコーディング、我々は共通MyBatisのページネーションのプラグインを使用する必要がありmybatis-pagehelper
、その後、プラグインの基本的な状況にあるのを見てみましょう。
mybatis-pagehelper
あなたが小さすぎるのパートナーを使用する場合:MyBatisのページネーションプラグPageHelperを、そしてこのことが理解しやすいですが、実際にはベースであるエグゼインターセプタ変換プロセスを実行するために、SQLを元のSQLを傍受した後、達成します。
三部作をコーディングspringbootに応じて、当社独自のコードの実装を見てみましょう:
1. [追加の依存
<!-- 引入mybatis-pagehelper 插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
一部の学生は、私は別の依存関係を使用していたと理由を導入することを、聞いてきますか?以前は使用しました:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
答えはここにある:ポータル依存している
我々は、我々はその使用することができ、springbootはspringbootを使用しているので、行って開発するプロジェクトを使用している自动装配
特性を、著者は、私たちがそのような達成を支援瓶自動組立を、私たちはを参照する必要があります書かOKの例。
設定を変更する2。
# mybatis 分页组件配置
pagehelper:
helperDialect: mysql #插件支持12种数据库,选择类型
supportMethodsArguments: true
3.変更されたコード
サンプルコード:
@Override
public CommonPagedResult searchProductList(String keyword, String sortby, Integer pageNumber, Integer pageSize) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("keyword", keyword);
paramMap.put("sortby", sortby);
// mybatis-pagehelper
PageHelper.startPage(pageNumber, pageSize);
val searchProductDTOS = this.productCustomMapper.searchProductList(paramMap);
// 获取mybatis插件中获取到信息
PageInfo<?> pageInfo = new PageInfo<>(searchProductDTOS);
// 封装为返回到前端分页组件可识别的视图
val commonPagedResult = CommonPagedResult.builder()
.pageNumber(pageNumber)
.rows(searchProductDTOS)
.totalPage(pageInfo.getPages())
.records(pageInfo.getTotal())
.build();
return commonPagedResult;
}
私たちはデータベースを照会する前に、我々が導入しているPageHelper.startPage(pageNumber, pageSize);
インターセプタはとき占いは、我々は、クエリのページに対処する必要がMyBatisの、このプラグインが開始されcom.github.pagehelper.PageInterceptor
、すべてのために、query
インターセプトがあったが、カスタムパラメータクエリを追加し、データの合計数を追加します。(私たちは、それを証明するために、SQLのフォローアップを印刷します。)
結果に問い合わせた後、我々はプラグインで、あるに我々の結果を照会する必要がありますPageInfo<?> pageInfo = new PageInfo<>(searchProductDTOS);
(com.github.pagehelper.PageInfo
プラグイン・パッケージ行うにはプロパティページ用である、あなたが特定見ることができますポータルプロパティを)。
この時点で、我々はプラグインを使用して終了しました。しかし、なぜ私たちは別のオブジェクトの背後にあることは、むしろにクエリを使用するよりも、外国での復帰をカプセル化しPageInfo
、それ?これは、当社の実際の開発プロセスは、パッケージ構造のデータ構造の一貫性を作るために、この手順を実現していない可能性があるため、結果に影響を与えないことです。
SQLのプリントコントラスト
2019-11-21 12:04:21 INFO ProductController:134 - ============根据关键词:西凤 搜索列表==============
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4ff449ba] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1980420239 wrapping com.mysql.cj.jdbc.ConnectionImpl@563b22b1] will not be managed by Spring
==> Preparing: SELECT count(0) FROM products p LEFT JOIN products_img pi ON p.id = pi.product_id LEFT JOIN (SELECT product_id, MIN(price_discount) AS priceDiscount FROM products_spec GROUP BY product_id) tp ON tp.product_id = p.id WHERE pi.is_main = 1 AND p.product_name LIKE "%西凤%"
==> Parameters:
<== Columns: count(0)
<== Row: 32
<== Total: 1
==> Preparing: SELECT p.id as productId, p.product_name as productName, p.sell_counts as sellCounts, pi.url as imgUrl, tp.priceDiscount FROM product p LEFT JOIN products_img pi ON p.id = pi.product_id LEFT JOIN ( SELECT product_id, MIN(price_discount) as priceDiscount FROM products_spec GROUP BY product_id ) tp ON tp.product_id = p.id WHERE pi.is_main = 1 AND p.product_name LIKE "%西凤%" ORDER BY p.sell_counts DESC LIMIT ?
==> Parameters: 10(Integer)
私たちは、SQLの1は、より多くのことを見ることができSELECT count(0)
、1つの以上の第二のSQL LIMIT
パラメータはコードで、我々は我々が検索すると、それはプラグインであることを確認するクエリの合計数を示さなかったことを非常に明確に知っています達成するために私たちを助けます。
ソースのダウンロード
セクションの下のお知らせ
私たちは、製品のリストを展開していきます次のセクションでは、すべての開発コンポーネントの過程で使用するために、ビジネスや製品レビューを表示し、私は特別を通じてパニックの最後に兄弟たちに紹介します!
GOGOGO!