mySQL中的子查询,用isbn而不是书名来指书

时间:2018-11-12 11:39:42

标签: mysql sql subquery union

我需要使用子查询方法,找到标题为“ Room”的书成为订单的一部分的次数。

相关架构表

orderDetails(oNo,bookISBN,数量)

book(isbn,书名,authorID,类型,pubYear,出版商, rrPrice,avgRating)

它以两个顺序出现,bookISBN和isbn是主键和外键

我尝试过

SELECT Count(*)
FROM orderDetails
WHERE  'Room' in (SELECT title
                         FROM book)

即使Room的订单只有两个,它也会返回25。我可以理解为什么这是错误的,但我不知道如何用ISBN来称呼这本书(不要只输入323,因为那样会很快捷)

4 个答案:

答案 0 :(得分:0)

您的where子句的计算结果为true或false。它与外部查询不相关,所以:

  • “ true”表示将返回(并计数)所有行
  • “假”表示没有返回(计数)行。

您可以通过使用相关子句来解决此问题:

SELECT Count(*)
FROM orderDetails od
WHERE 'Room' IN (SELECT b.title FROM book b WHERE od.bookISBN = b.ISBN);

答案 1 :(得分:0)

使用此查询

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

      <android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:weightSum="100">
            <ImageButton
                android:id="@+id/homeButton"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                android:contentDescription="@string/home"
                app:srcCompat="@drawable/ic_home" />
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="60"
                android:gravity="center"
                android:text="@string/app_name"
                android:textSize="24sp"
                android:textStyle="bold"
                app:fontFamily="Sans Serif" />
            <ImageButton
                android:id="@+id/menuButton"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="20"
                android:contentDescription="@string/menu"
                app:srcCompat="@drawable/ic_menu_black_24dp" />
        </LinearLayout>
    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

      <WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</LinearLayout>

您也可以在子查询中使用SELECT Count(*) FROM orderDetails WHERE bookISBN in (SELECT isbn FROM book where title = 'Room') 运算符Like作为标题

答案 2 :(得分:0)

常规查询,不使用子查询:

   LookupOperation lookupOperation =LookupOperation.newLookup().from("simple").localField("execId.ref.uuid").foreignField("uuid").as("simple");
            Aggregation myDocAggr = newAggregation(match(Criteria.where("metaId.ref.uuid").is(someUUID)), group("uuid").max("version").as("version"),
                    lookupOperation,
                    Aggregates.unwind(""),
                Aggregates.addFields(fields));
            Document document =new Document();
            AggregationResults<String> myDocAggrResults = mongoTemplate.aggregate(myDocAggr , myDocument, myDocument.class);
            List<String> mydocumentList = myDocAggrResults .getMappedResults();

具有内部查询的异常查询,我不建议这样做,因为这是不必要的,但是我们开始:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN book b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%'

更多带有子查询的异常查询:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN (
        SELECT isbn, title FROM book
    ) b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%

提示:

1.我使用过SELECT COUNT(1) FROM orderDetails od WHERE od.bookISBN IN (SELECT isbn FROM book WHERE title like '%ROOM%') ,因为没有必要对所有列进行计数,因此,您可以只对条件中的成功条目进行计数,这样会更快。
< br /> 2.使用子查询会限制编译器的功能,因此,我建议不要这样做。

答案 3 :(得分:-1)

我认为“加入”会更好:

SELECT Count(*)
FROM orderDetails LEFT JOIN book ON isbn=bookISBN
WHERE  title LIKE N'%Room%'

但是如果您必须使用子查询:

SELECT Count(*)
FROM orderDetails
WHERE  bookISBN in (SELECT isbn
                    FROM book 
                    WHERE title LIKE N'%Room%')

无论我们使用哪种方式,我们始终必须使用公共字段来获取