ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL-запроса - неожиданные результаты


У меня есть таблицы:

  1. Поездки: trip_num, trip_type, trip_geographic и т.Д.

  2. Travelers_trips_history: Имя пользователя, номер поездки, тип поездки, сезон поездки и т.Д.

В таблице 2 указаны поездки, которые совершил пользователь, и мне нужно знать, что является наиболее распространенным Trip_Geographic в истории его поездки (Trip_Geographic должен быть известен по таблице 1 - поездки по его trip_num).

Я делаю проект на PHP, и мне нужно выполнить SQL-запрос для определенного пользователь (по его имени пользователя) - необходимо получить таблицу, столбцы которой следующие: 1. trip_geographic, количество случаев, когда trip_geographic находится в истории travelers_trips_history.

Прикрепил таблицы, которые у меня есть:
поездки
trips

Путешественник_трипс_история
travelers_trips_history

Запрос, который я сделал:

$query = "select traveler_trips_history.*, COUNT(trips.Trip_Geographic) AS Trip_Geographic_occurrence 
FROM traveler_trips_history INNER JOIN trips ON 
travelers_trips_history.Trip_Num = trips.Trip_Num 
GROUP BY Trip_Geographic 
ORDER BY Trip_Geographic_occurrence DESC
WHERE traveler_trips_history.Traveler_Username = $username";

Я получаю сообщение об ошибке Group BY (проверьте синтаксис), однако я не уверен, что запрос будет делать то, что он должен делать.

Author: Blank, 2016-05-04

4 answers

В вашем запросе есть 2 проблемы:

1- У вас должно быть предложение where перед предложением GroupBy

2- Если вы группируете по Col1, вы можете выбрать только Col1 или использовать агрегатные функции для других столбцов (СУММА, СРЕДНЕЕ значение и т. Д...)

Вам нужно проверить правила для GroupBy и понять их лучше.

Редактировать после вашего комментария:

$query = "select Trip_Geographic, COUNT(*) AS Trip_Geographic_occurrence 
FROM traveler_trips_history INNER JOIN trips ON 
travelers_trips_history.Trip_Num = trips.Trip_Num 
WHERE traveler_trips_history.Traveler_Username = $username
GROUP BY Trip_Geographic 
ORDER BY Trip_Geographic_occurrence DESC";
 2
Author: user3185569, 2016-05-04 14:01:17

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

    SELECT traveler_trips_history.*
    ,COUNT(trips.Trip_Geographic) AS Trip_Geographic_occurrence
FROM traveler_trips_history
INNER JOIN trips ON travelers_trips_history.Trip_Num = trips.Trip_Num
WHERE traveler_trips_history.Traveler_Username = $USERNAME
GROUP BY traveler_trips_history.travelers_trips_history
    ,traveler_trips_history.Username
    ,traveler_trips_history.Trip_Num
    ,traveler_trips_history.Trip_Type
    ,traveler_trips_history.Trip_Season
ORDER BY Trip_Geographic_occurrence DESC
 3
Author: SimarjeetSingh Panghlia, 2016-05-04 06:12:29

Попробуйте вот так

Проблема заключается в вашем предложении where и группировании по столбцам.

     SELECT tr.Trip_Geographic
    ,COUNT(hs.*) AS Trip_Geographic_occurrence
FROM traveler_trips_history hs
INNER JOIN trips tr ON hs.Trip_Num = tr.Trip_Num
WHERE hs.Username = $USERNAME
GROUP BY tr.Trip_Geographic
ORDER BY Trip_Geographic_occurrence DESC
 0
Author: StackUser, 2016-05-04 05:57:47

Ваша проблема заключается в том, что предложение WHERE после ГРУППИРУЕТСЯ по и использует столбцы, которые не входят в СГРУППИРОВАННЫЕ ПО или АГРЕГАТНЫЕ функции. Попробуйте выполнить следующее, в котором указано имя пользователя, trip_geographic и нет поездок.

select traveler_trips_history.Traveler_Username, traveler_trips_history.Trip_Geographic, COUNT(trips.Trip_Geographic) AS Trip_Geographic_occurrence 
FROM traveler_trips_history INNER JOIN trips ON 
travelers_trips_history.Trip_Num = trips.Trip_Num 
GROUP BY Trip_Geographic, traveler_trips_history.Traveler_Username
having traveler_trips_history.Traveler_Username = $username
ORDER BY Trip_Geographic_occurrence DESC
 0
Author: Chinthaka Senaratne, 2016-05-04 06:24:31