MYSQL匹配具有多个ID的同一张表中的多行

时间:2019-01-18 21:40:54

标签: mysql sql match where-in

我正在研究一种处理订单的方法,我必须满足多个供应商的订单,并且我想知道哪两个供应商可以提供给定订单。

我的订单中的product_id是10,20,30,40,50

SELECT * 
  FROM vendors 
 WHERE product_id IN (10,20,30,40,50)

请给我所有拥有至少一种产品的供应商

vendor_id | product_id 
1234          10
1234          20
1234          30
1234          40
1235          10
1235          40
1236          20
1236          30
1236          40
1237          50
9876          10
9876          20
9876          30
9876          40
9877          10
9877          40
9877          50
9878          10
9878          20
9878          30
9878          50

经过几次疯狂的子查询(时间太长,无法在此处发布)之后,我可以转到一张表,向我显示每个供应商所缺少的东西,我的想法是,然后根据那些缺失的商品将其加入该表,然后向供应商显示谁有完善的清单。

结果应该看起来像(逗号分隔与否无关紧要,只是易于阅读)

vender_1 | product_id   |   missing_product_id   | vendor_2
1234       10,20,30,40          50                 9876,9878
1235        10,40            20,30,50              9878
1236        20,30,40           10,50               9877
1237        50              10,20,30,40            1234

vender_1 | product_id   |   missing_product_id   | vendor_2
1234           10          
1234           20              
1234           30           
1234           40                                 
1234                              50                 9876
1234                              50                 9878

等...

1 个答案:

答案 0 :(得分:0)

您想要<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="viewmodel" type="app.coinverse.home.HomeViewModel" /> </data> <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipeToRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white"> <com.google.android.material.appbar.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:layout_scrollFlags="scroll|snap"> <androidx.appcompat.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="@dimen/padding_small" android:paddingRight="@dimen/padding_small"> <ImageView android:id="@+id/profileButton" android:layout_width="@dimen/toolbar_button_dimen" android:layout_height="@dimen/toolbar_button_dimen" android:layout_gravity="start" android:contentDescription="@string/profile_content_description" android:src="@drawable/ic_astronaut_color_accent_24dp" app:layout_constraintLeft_toLeftOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.appcompat.widget.Toolbar> <FrameLayout android:id="@+id/priceContainer" android:name="app.carpecoin.PriceDataFragment" android:layout_width="match_parent" android:layout_height="@dimen/price_graph_height" app:layout_collapseMode="parallax" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" /> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <FrameLayout android:id="@+id/contentContainer" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/bottomSheet" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/margin_large" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> <ImageView android:id="@+id/bottom_handle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_bottom_sheet_handle" android:contentDescription="@string/saved_bottomsheet_handle_content_description" android:elevation="@dimen/bottom_sheet_elevation_height" android:src="@drawable/ic_save_planet_dark_48dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:id="@+id/bottom_handle_elevation" android:layout_width="0dp" android:layout_height="@dimen/bottom_sheet_elevation_height" android:background="@color/bottom_sheet_handle_elevation" android:contentDescription="@string/saved_bottomsheet_handle_content_description" app:layout_constraintBottom_toBottomOf="@id/bottom_handle" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <FrameLayout android:id="@+id/savedContentContainer" android:layout_width="match_parent" android:layout_height="0dp" android:background="@android:color/white" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/bottom_handle_elevation" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="viewmodel" type="app.coinverse.content.ContentViewModel" /> </data> <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/contentFragment" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <include android:id="@+id/actionbar" layout="@layout/toolbar" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/contentRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/actionbar" /> <include android:id="@+id/emptyContent" layout="@layout/empty_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/actionbar" /> </RelativeLayout </androidx.coordinatorlayout.widget.CoordinatorLayout> </layout>

{
    "httpMethod": "GET",
    "resourcePath": "/deployment",
    "status": "403",
    "protocol": "HTTP/1.1",
    "responseLength": "42"
}

对于多个供应商,您可以扩展上述逻辑。想法是将表连接在一起以获取供应商对以及他们在一起拥有的所有产品的列表。然后,执行与上述相同的逻辑:

"DeploymentApiGatewayMetricFilter": {
  "Type": "AWS::Logs::MetricFilter",
  "Properties": {
    "LogGroupName": "/aws/apigateway/DeploymentApiGatewayLogGroup",
    "FilterPattern": "{ $.status = \"403\" }",
    "MetricTransformations": [
      {
        "MetricValue": "1",
        "MetricNamespace": "ApiGateway",
        "DefaultValue": 0,
        "MetricName": "DeploymentApiGatewayUnauthorized"
      }
    ]
  }
}

您实际上可以在子查询中进行产品过滤-使查询更高效。为了使其更通用,“ 5”是项数。我不知道最终查询是如何构建的。

编辑II:

这是一个处理大量数据的难题。如果您有很多产品而很少有供应商,这是另一种可能会更好的方法:

"{ $.status = 403 }" <- no escaped characters
{ $.status = 403 } <- using a json object instead of string

注意:如果一个供应商拥有所有产品,则它将与其他所有供应商配对。