SQL INNER JOIN возвращает значение внешнего ключа вместо значения первичного ключа - PullRequest
0 голосов
/ 04 октября 2019

У меня есть API Flask, где я возвращаю продукты с одной из конечных точек, и я использую запрос INNER JOIN, чтобы получить категорию и информацию о пользователе. Это моя конечная точка:

# Return all products
@products_api.route('/v1/resources/products/all', methods=['GET'])
def api_all():
    conn = databaseConnection()
    cur = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
    sql_all_products = cur.execute('SELECT * FROM products a INNER JOIN users b ON a.user_id = b.id INNER JOIN product_categories c ON a.product_category_id = c.category_id ORDER BY a.id, b.id;')
    all_products = cur.fetchall()
    return jsonify(all_products)

Ответ такой:

[
      {
      "available_from": "Fri, 20 Sep 2019 11:00:00 GMT",
      "available_until": "Wed, 25 Sep 2019 12:00:00 GMT",
      "avatar_url": null,
      "category_id": 1,
      "category_name": "Power Tools",
      "created_date": "Mon, 16 Sep 2019 02:55:48 GMT",
      "description": "The desc.",
      "email": "benj@example.com",
      "email_confirmation_sent_time": "Mon, 16 Sep 2019 16:10:35 GMT",
      "email_confirmed": true,
      "email_confirmed_time": null,
      "firstname": "Ben",
      "id": 32,
      "is_draft": false,
      "last_updated_date": "Mon, 16 Sep 2019 02:55:48 GMT",
      "location": "Johannesburg",
      "parent_id": null,
      "product_category_id": 1,
      "quantity": 2,
      "quantity_available": 2,
      "rental_price": "40",
      "replacement_value": "600",
      "surname": "Jay",
      "title": "The title",
      "user_id": 32,
      "username": "test-user"
   },
      {
      "available_from": "Fri, 20 Sep 2019 00:00:00 GMT",
      "available_until": "Mon, 23 Sep 2019 00:00:00 GMT",
      "avatar_url": null,
      "category_id": 1,
      "category_name": "Power Tools",
      "created_date": "Mon, 16 Sep 2019 02:55:48 GMT",
      "description": "The test description.",
      "email": "benj@example.com",
      "email_confirmation_sent_time": "Mon, 16 Sep 2019 16:10:35 GMT",
      "email_confirmed": true,
      "email_confirmed_time": null,
      "firstname": "Ben",
      "id": 32,
      "is_draft": false,
      "last_updated_date": "Mon, 16 Sep 2019 02:55:48 GMT",
      "location": "Sandton",
      "parent_id": null,
      "product_category_id": 1,
      "quantity": 2,
      "quantity_available": 2,
      "rental_price": "60",
      "replacement_value": "400",
      "surname": "Jay",
      "title": "The test product",
      "user_id": 32,
      "username": "test-user"
   }
]

В моем ожидаемом ответе идентификатор будет содержать значение первичного ключа таблицы products, но вместо этого он возвращаетзначение первичного ключа таблицы user (32). Как я могу изменить это так, чтобы значение id в ответе было идентификатором продукта, а не значением user_id?

РЕДАКТИРОВАТЬ - Вот столбцы:

users

id, username, firstname, surname, email, password, email_confirmation_sent_time, email_confirmed, email_confirmed_time, avatar_url, created_date, last_updated_date

products

id, product_category_id, user_id, title, location, description, rental_price, quantity, quantity_available, replacement_value, available_from, available_until, is_draft, created_date, last_updated_date

product_categories

category_id, category_name, parent_id

1 Ответ

1 голос
/ 04 октября 2019

Вы просто получаете данные из 1-й или первичной таблицы, а для остальных таблиц, при необходимости, выбираете только те столбцы, которые вам нужны.

Попробуйте это

SELECT a.*, b.id as userID, b.username, b.firstname, b.surname, b.email, b.password, b.email_confirmation_sent_time, b.email_confirmed, b.email_confirmed_time, b.avatar_url, b.created_date, b.last_updated_date, c.category_id, c.category_name, c.parent_id FROM products a INNER JOIN users b ON a.user_id = b.id INNER JOIN product_categories c ON a.product_category_id = c.category_id ORDER BY a.id, b.id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...