0

team.id = (auth_users WHERE id = offers.user_id から team_id を選択) で LEFT JOIN チーム

team テーブルのすべての列を取得しますが、すべてを NULL に変換します。

LEFT JOIN teams ON teams.id = 1

魅力のように機能します

私がする時

SELECT (SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id

team_id は 1 になります。

何らかの奇妙な理由で、 内では機能しませんJOIN

完全なクエリ:

SELECT projects.id, projects.title as title, winner_id, projects.user_id as user_id,   until, pages, types.title as type, types.id as type_id, projects.id as id, offers.price as price, offers.delivery_date as delivery_date, teams.*,
(SELECT COUNT(id) FROM comments WHERE comments.project_id = projects.id AND comments.private = 1) as comments,
(SELECT COUNT(id) FROM uploads WHERE uploads.project_id = projects.id) as files,
(SELECT country FROM auth_users WHERE auth_users.id = offers.user_id) as baser_country,
(SELECT business FROM auth_users WHERE auth_users.id = offers.user_id) as baser_business,
(SELECT CONCAT(firstname, ' ', lastname) FROM auth_users WHERE auth_users.id = offers.user_id) as baser_name,
(SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id,
(SELECT country FROM auth_users WHERE auth_users.id = projects.user_id) as customer_country,
(SELECT business FROM auth_users WHERE auth_users.id = projects.user_id) as customer_business
FROM projects
JOIN types ON projects.type_id = types.id
LEFT JOIN offers ON projects.id = offers.project_id
LEFT JOIN teams ON teams.id = (SELECT team_id FROM auth_users WHERE id = offers.user_id)
WHERE projects.user_id = 1 AND winner_id != 0 AND uploaded = 1
GROUP BY projects.id
ORDER BY projects.id DESC
LIMIT 3

前もって感謝します!

4

1 に答える 1

5

まず、これらすべてのサブクエリを削除する必要があります。正しい結合があれば、それらのどれも本当に必要ではありません。それらはクエリを非常に混雑させ、クエリのパフォーマンスには寄与しません。

私の理解では、クエリは次のようになります。

SELECT 
  p.id                 AS project_id, 
  MIN(p.title)         AS project_title, 
  MIN(winner_id)       AS winner_id, 
  MIN(p.user_id)       AS project_user_id,
  MIN(until)           AS until, 
  MIN(pages)           AS pages, 
  MIN(t.id)            AS type_id, 
  MIN(t.title)         AS type_title, 
  MIN(o.price)         AS offer_price, 
  MIN(o.delivery_date) AS offer_delivery_date, 
  -- m.*, <-- this should be avoided, especially in a grouped query
  COUNT(c.id)          AS count_comments,
  COUNT(u.id)          AS count_files,
  MIN(ao.country)      AS baser_country,
  MIN(ao.business)     AS baser_business,
  MIN(CONCAT(ao.firstname, ' ', ao.lastname)) AS baser_name,
  MIN(ao.team_id)      AS baser_team_id,
  MIN(ap.country)      AS customer_country,
  MIN(ap.business)     AS customer_business
FROM 
  projects p
  INNER JOIN types       t ON p.type_id    = t.id
  LEFT  JOIN offers      o ON o.project_id = p.id
  LEFT  JOIN comments    c ON c.project_id = p.id AND comments.private = 1
  LEFT  JOIN uploads     u ON u.project_id = p.id
  LEFT  JOIN auth_users ao ON ao.id = o.user_id
  LEFT  JOIN auth_users ap ON ap.id = p.user_id
  LEFT  JOIN teams       m ON m.id  = o.team_id
WHERE 
  p.user_id = 1 
  AND winner_id != 0 
  AND uploaded = 1
GROUP BY 
  p.id
ORDER BY 
  p.id DESC
LIMIT 3

次に、グループ化も集約もされていないフィールドを出力に含むグループ化されたクエリを記述しないでください。MIN()クエリのすべての不正なグループ化されていないフィールドで集計関数を使用しました。

短いテーブルエイリアスを使用することをお勧めします。また、どこでもテーブルエイリアスを使用することをお勧めします。たとえば、サードパーティの読者として、どのテーブル" winner_id"が由来するかという質問に関しては完全に迷っています。

于 2009-07-28T13:03:16.737 に答える