Saya perlu mengambil semua pengaturan default dari tabel pengaturan tetapi juga mengambil pengaturan karakter jika ada untuk karakter x.
Tapi kueri ini hanya mengambil pengaturan yang karakternya = 1, bukan pengaturan default jika pengguna tidak mengatur siapa pun.
SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT JOIN `character_settings`
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1'
Jadi saya perlu sesuatu seperti ini:
array(
'0' => array('somekey' => 'keyname', 'value' => 'thevalue'),
'1' => array('somekey2' => 'keyname2'),
'2' => array('somekey3' => 'keyname3')
)
Di mana kunci 1 dan 2 adalah nilai default ketika kunci 0 berisi nilai default dengan nilai karakter.
sumber
Anda mungkin lebih mudah untuk memahami dengan menggunakan subquery sederhana
Subquery diperbolehkan untuk mengembalikan null, jadi Anda tidak perlu khawatir tentang GABUNG / DIMANA dalam permintaan utama.
Terkadang, ini berhasil lebih cepat di MySQL, tetapi bandingkan dengan formulir LEFT JOIN untuk melihat mana yang paling cocok untuk Anda.
sumber
Hasilnya benar berdasarkan pernyataan SQL. Gabung kiri mengembalikan semua nilai dari tabel kanan, dan hanya nilai yang cocok dari tabel kiri.
Kolom ID dan NAME berasal dari tabel sebelah kanan, jadi dikembalikan.
Skor berasal dari tabel kiri, dan 30 dikembalikan, karena nilai ini berkaitan dengan Nama "Aliran". Nama-nama lain adalah NULL karena mereka tidak berhubungan dengan Nama "Aliran".
Di bawah ini akan mengembalikan hasil yang Anda harapkan:
SQL menerapkan filter di tabel sebelah kanan.
sumber
Untuk masalah ini, karena bagi banyak orang lain yang melibatkan sambungan kiri non-sepele seperti sambungan kiri pada tabel gabungan, saya merasa nyaman dan agak lebih mudah dibaca untuk membagi kueri dengan
with
klausa. Dalam contoh Anda,sumber