2016-07-19 5 views
0

Я хочу сортировать книги, написанные автором на английском языке в DESC год публикации. Я подключил внутреннее соединение, но не могу преобразовать строку в int, чтобы она не работала. Любые идеи, пожалуйста?SQL database join

CREATE DATABASE [Books Database] 

    CREATE TABLE [Books] 
    (
    [id] [int] IDENTITY (1,1) NOT NULL, 
    [book name] [NVARCHAR] (75), 
    [year published] [int], 
    [book prize won] [NVARCHAR] (75), 
    ) 



    INSERT INTO [Books] ([book name], [year published], [book prize won]) 
    VALUES('Amsterdam',1998, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The God of Small Things',1997, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Cost of Living',1999, NULL) 

    INSERT INTO [Books] 
    VALUES('Last Orders',1996, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Sweetshop Owner',1997,NULL) 

    INSERT INTO [Books] 
    VALUES('How Late it Was, How Late',1994 , 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('Spirit Level',1996, 'Whitbread Poetry and the Whitbread Book prizes') 

    INSERT INTO [Books] 
    VALUES('Behind the Scenes at the Museum',1995 , 'Whitbread Book prize') 

    INSERT INTO [Books] 
    VALUES('Emotionally Weird',2000, NULL) 

    INSERT INTO [Books] 
    VALUES('Human Croquet',1998, NULL) 

    INSERT INTO [Books] 
    VALUES('Felicia''s Journey' ,1994, 'Whitbread Novel and the Whitbread Book prizes') 

    INSERT INTO [Books] 
    VALUES('Every Man for Himself',1996, 'Whitbread Novel prize') 

    INSERT INTO [Books] 
    VALUES('Midnight''s Children',1980, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Satanic Verses',1988, 'Whitbread Novel prize') 

    INSERT INTO [Books] 
    VALUES('The Moor''s Last Sigh',1995 , 'Whitbread Novel prize') 


    INSERT INTO [Books] 
    VALUES('Larry''s Party',1998, 'Orange prize') 


    INSERT INTO [Books] 
    VALUES('Fugitive Pieces',1997 , 'Orange and the Guardian Fiction prizes') 


    INSERT INTO [Books] 
    VALUES('Reading in the Dark' ,1996 , 'Guardian Fiction prize') 


    INSERT INTO [Books] 
    VALUES('Debatable Land',1994, 'Guardian Fiction prize') 


    CREATE TABLE [Authors] 
    (
    [id] [int] IDENTITY (1,1) NOT NULL, 
    [author name] [NVARCHAR] (75), 
    [author surname] [NVARCHAR] (75), 
    [nationality] [NVARCHAR] (75), 
    [yob] [int] 
    ) 


    INSERT INTO [Authors] ([author name], [author surname],[nationality], [yob]) 
    VALUES('Ian', 'McEwan', 'English', 1948) 

    INSERT INTO [Authors] 
    VALUES('Arundhati','Roy', 'Indian', 1961) 

    INSERT INTO [Authors] 
    VALUES('Graham','Swift', 'English', 1949) 

    INSERT INTO [Authors] 
    VALUES('James','Kelman', 'Scottish', 1946) 

    INSERT INTO [Authors] 
    VALUES('Seamus','Heaney', 'Irish', 1939) 

    INSERT INTO [Authors] 
    VALUES('Kate','Atkinson', 'English', 1951) 

    INSERT INTO [Authors] 
    VALUES('William','Trevor','Irish', 1928) 

    INSERT INTO [Authors] 
    VALUES('Beryl','Bainbridge','English', 1936) 

    INSERT INTO [Authors] 
    VALUES('Salman','Rushdie','Indian', 1947) 

    INSERT INTO [Authors] 
    VALUES('Carol','Shields','American', 1950) 

    INSERT INTO [Authors] 
    VALUES('Anne','Michaels','Canadian', 1955) 

    INSERT INTO [Authors] 
    VALUES('Seamus','Deane','Irish', 1940) 

    INSERT INTO [Authors] 
    VALUES('Candia','McWilliam','Scottish', 1955) 



    /* 1) List name and surname of all authors in alphabetical order. */ 
    SELECT TOP 1000 [id] 
      ,[author name] 
      ,[author surname] 
      ,[nationality] 
      ,[yob] 
     FROM [Books Database].[dbo].[Authors] 
     ORDER BY [author name],[author surname] ASC 



     /* 2) List title of all books written by English authors in descending order of publication year. */ 


    SELECT TOP 1000 
      [author name] 
      ,[author surname] 
      ,[nationality] 
      ,[yob] 
     FROM [Books Database].[dbo].[Authors] 
     INNER JOIN [Books Database].[dbo].[Books] 
     ON [Books Database].[dbo].[Authors].[nationality] = [Books Database].[dbo].[Books].[year published] 
     ORDER BY [year published] DESC 
+0

'так что это не сработает' ... это не облегчает нам помощь. Кроме того, не существует способа связать таблицы «Книга» и «Автор». Присоединение, которое вы делаете, не имеет смысла, и я не вижу ничего такого. –

+0

Tagged 'sql-server', но вы указываете' mysql' в своем вопросе. Просьба уточнить. –

+0

Ваше участие идет от авторской национальности к году издания книг - это звучит как разумное соединение с вами? – Jamiec

ответ

1

Есть 2 проблемы в следующем JOIN запросе:

INNER JOIN [Books Database].[dbo].[Books] 
ON [Books Database].[dbo].[Authors].[nationality] = [Books Database].[dbo].[Books].[year published] 

Выпуск 1:

Здесь [nationality] является VARCHAR(75) и [year published] является INT. Соответствие различного типа данных вызовет проблему преобразования.

Данное условие может быть доработает до:

FROM [Books Database].[dbo].[Authors] AU 
INNER JOIN [Books Database].[dbo].[Books] BO ON AU.[yob] = BO.[year published] 

это означает соответствие значения года из обеих таблиц и их тип данных INT

Выпуск 2:

Надежда те же не будет возвращать данные в вашем случае, потому что в Authors таблица yob варьируется от 1928 года до 1961 года и в Books варьируется от y ухо с 1980 по 2000 год.

Я добавил AU, BO - имя псевдонима для лучшей читаемости.

+0

Да, он ничего не возвращает, как мне его исправить? –

+0

@TudorIoanVelcescu: Добавьте действительный год соответствия в обе таблицы. Else, используя ['LEFT JOIN'] (https://msdn.microsoft.com/en-us/library/bb208894 (v = office.12) .aspx), вы можете получить результат из первой таблицы, если он не" t имеет какое-либо совпадение. – Arulkumar

0

Для этого вам нужно каким-либо образом связать книгу с ее авторами. Как книга может иметь много авторов, и у автора может быть много книг, это, как правило, будет смоделировано как Many-to-many relationship (несколько неудивительно, что пример использования вики для отношений M2M - это книги-авторы)

Вам нужно добавить другую таблицу , называется что-то в строках «BookAuthors», которое содержит внешний ключ для бронирования id и внешний ключ к автору id.

После того, как вы есть, что вы присоединиться Книги к BookAuthors и BookAuthors авторов, фильтр только авторов, которые являются английский и поместить результаты в обратной публикации года порядка

Это будет вдоль линий

SELECT DISTINCT 
b.[book name], 
b.[year published] 
FROM Books b 
INNER JOIN BookAuthors ba ON b.id = ba.bookId 
INNER JOIN Authors a ON ba.authorId = a.Id 
WHERE a.nationality = 'English' 
ORDER BY b.[year published] DESC 
+0

Не могли бы вы объяснить мне, как создать внешний ключ для бронирования ID? –

+0

@TudorIoanVelcescu в SqlServer (с тегом) или MySql (текст вопроса) – Jamiec

+0

Внешний ключ в MySql –