Saya membaca banyak utas tentang mendapatkan hanya baris pertama dari gabungan kiri, tetapi, untuk beberapa alasan, ini tidak berfungsi untuk saya.
Ini struktur saya (tentu saja disederhanakan)
Feed
id | title | content
----------------------
1 | Feed 1 | ...
Artis
artist_id | artist_name
-----------------------
1 | Artist 1
2 | Artist 2
feeds_artists
rel_id | artist_id | feed_id
----------------------------
1 | 1 | 1
2 | 2 | 1
...
Sekarang saya ingin mendapatkan artikel dan hanya bergabung dengan Artis pertama dan saya memikirkan sesuatu seperti ini:
SELECT *
FROM feeds
LEFT JOIN feeds_artists ON wp_feeds.id = (
SELECT feeds_artists.feed_id FROM feeds_artists
WHERE feeds_artists.feed_id = feeds.id
LIMIT 1
)
WHERE feeds.id = '13815'
hanya untuk mendapatkan hanya baris pertama dari feeds_artists, tetapi sudah ini tidak berfungsi.
Saya tidak dapat menggunakan TOP
karena basis data saya dan saya tidak dapat mengelompokkan hasil feeds_artists.artist_id
karena saya perlu mengurutkannya berdasarkan tanggal (saya mendapat hasil dengan mengelompokkannya dengan cara ini, tetapi hasil di mana bukan yang terbaru)
Mencoba sesuatu dengan OUTER BERLAKU juga - tidak berhasil juga. Sejujurnya saya tidak bisa membayangkan apa yang terjadi di baris itu - mungkin alasan terbesar mengapa saya tidak bisa mendapatkan ini berfungsi.
LARUTAN:
SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
SELECT artist_id
FROM feeds_artists fa
WHERE fa.feed_id = f.id
LIMIT 1
)
WHERE f.id = '13815'
Jawaban:
Jika Anda dapat mengasumsikan bahwa kenaikan ID artis dari waktu ke waktu, maka yang
MIN(artist_id)
akan paling awal.Jadi cobalah sesuatu seperti ini (belum diuji ...)
sumber
Versi tanpa subselect:
sumber
@Matt Dodges menjawab menempatkan saya di jalur yang benar. Terima kasih sekali lagi untuk semua jawaban, yang membantu banyak pria dalam waktu yang bersamaan. Mengerjakannya seperti ini:
sumber
f.id
kondisi.Saya telah menggunakan sesuatu yang lain (saya pikir lebih baik ...) dan ingin membagikannya:
Saya membuat VIEW yang memiliki klausa "grup"
Saya ingin mengatakan, bahwa saya pikir kita perlu melakukan solusi ini KARENA KITA MELAKUKAN SESUATU YANG SALAH DALAM ANALISIS ... setidaknya dalam kasus saya ... tapi kadang-kadang lebih murah untuk melakukan ini untuk mendesain ulang semuanya ...
Saya harap ini membantu!
sumber
country_code
, ituGROUP BY
tidak tepat. LihatONLY_FULL_GROUP_BY
.WITH x AS (
klausa?berdasarkan beberapa jawaban di sini, saya menemukan sesuatu yang bekerja untuk saya dan saya ingin menggeneralisasi dan menjelaskan apa yang terjadi.
mengubah:
untuk:
kondisi yang menghubungkan t1 dan t2 dipindahkan dari
ON
dan ke permintaan dalamWHERE
. yangMIN(primary key)
atauLIMIT 1
merek yakin bahwa hanya 1 baris dikembalikan oleh query batin.setelah memilih satu baris tertentu, kita perlu memberi tahu
ON
baris yang mana. itu sebabnyaON
adalah membandingkan kunci utama dari tabel yang bergabung.Anda dapat bermain dengan kueri dalam (yaitu urutan + batas) tetapi harus mengembalikan satu kunci utama dari baris yang diinginkan yang akan memberi tahu
ON
baris yang tepat untuk bergabung.sumber
LIMIT
atau hanyaMIN
. yangON
kondisi harus di meja bergabung kunci utama untuk dampak kinerja menghindari.Saya ingin memberikan jawaban yang lebih umum . Satu yang akan menangani kasus apa pun ketika Anda ingin memilih hanya item pertama dalam KIRI BERGABUNG .
Anda dapat menggunakan subquery yang GROUP_CONCATS apa yang Anda inginkan (diurutkan, juga!), Kemudian hanya membagi hasil GROUP_CONCAT dan hanya mengambil item pertama, seperti begitu ...
Karena kami memiliki DESC sebagai opsi ORDER BY kami , ini akan mengembalikan id Orang untuk seseorang seperti "Zack". Jika kami menginginkan seseorang dengan nama seperti "Andy", kami akan mengubah ORDER BY FirstName DESC menjadi ORDER BY FirstName ASC .
Ini gesit, karena ini menempatkan kekuatan pemesanan sepenuhnya di tangan Anda. Tetapi, setelah banyak pengujian, itu tidak akan skala baik dalam situasi dengan banyak pengguna dan banyak data.
Namun, ini berguna dalam menjalankan laporan intensif data untuk admin.
sumber
GROUP_CONCAT
trick baik selama jumlah nilai terbatas. Batas default adalah 1024 karakter.